サーバに置かれたファイルを圧縮してブラウザからダウンロードします。

フォルダ構成

ファイル構成を次に示します。フォルダ「filedownload/file」は圧縮されるフォルダになります。フォルダ「filedownload/work」は作業用のフォルダになります。

ボリューム シリアル番号は 0000004A 463E:749A です
G:\FILEDOWNLOAD
│  download.php
│  index.html
│
├─file
│  ├─folderA
│  │      text.txt
│  │
│  └─folderB
│          img.png
│
├─js
│      main.js
│
└─work
        download.zip

ファイルのダウンロードアプリの作成

ファイルのダウンロードアプリを次のように作成します。

filedownload/index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="ja">
 
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 
        integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
 
    <title>ファイルダウンロード</title>
</head>
 
<body>
    <div class="container">
 
        <div class="col-5 mt-2 d-grid">
            <button type="button" class="btn btn-primary mt-2 fs-1 top-btn-l" id="download">Download</button>
        </div>
 
    </div>
 
        integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p"
        crossorigin="anonymous"></script>
    <script src="js/main.js"></script>
 
</body>
 
</html>

filedownload/js/main.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$('#download').on('click', function () {
    console.log('Downloadボタンがクリックされました。\n');
 
    let folders = [];
    console.log('okボタンがクリックされました。00 ');
    folders[0] = 'folderA/text.txt';
    folders[1] = 'folderB/img.png';
 
    console.log(folders);
 
    $('#data-displayalert').modal('hide');
    $.ajax({
        url: "./download.php",
        type: "POST",
        data: { "folders": folders },
        dataType: "json",
    })
        .done(function (data) {
            // success
            //取得jsonデータ
            console.log(data);
 
            var anchor = document.createElement('a');
            document.body.appendChild(anchor);
            anchor.style = "display: none";
            anchor.href = './work/' + data.zipPath;
            anchor.download = data.zipPath;
            anchor.click();
 
        })
        .fail(function (data, textStatus, errorThrown) {
            // error
            console.log('error: ' + data.responseText);
        });
 
});

filedownload/download.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
 
$list = array();
 
$list = array("zipPath" => filedownload($_POST['folders']));
 
header("Content-type: application/json; charset=UTF-8");
echo json_encode($list);
exit;
 
function filedownload($folderlist)
{
     // Zip ファイル名
     $fileName = "download.zip";
     // ファイルディレクトリ
     $dir = __DIR__ . "/file";
     // Zip ファイルパス
     $zipPath = __DIR__ . "/work/" . $fileName;
     // インスタンス作成
     $zip = new ZipArchive();
     // Zip ファイルをオープン
     $res = $zip->open($zipPath, ZipArchive::CREATE);
     // Zip ファイルのオープンに成功した場合
     if ($res === true) {
          foreach ($folderlist as $val) {
               $zip->addFile("$dir/$val", $val);
          }
          // Zip ファイルをクローズ
          $zip->close();
          return $fileName;
     } else {
          echo "error Zip ファイル作成";
     }
}
 
?>

ファイルのダウンロードアプリの実行

URL「http://localhost/filedownload/」をアクセスし、Downloadボタンを押すと、フォルダ「file」配下のファイルが圧縮されてダウンロードされます。