Help us understand the problem. What is going on with this article?

ファイルをダウンロードさせる方法

リンククリックでファイルをダウンロードさせる方法についてまとめました。

右クリック→リンク先を保存ではなく、リンクボタンをクリックしただけでダウンロードさせるという方法です。

画像などの単体ファイルをダウンロードさせる

index.html
<a href="ファイル名" download>ファイルをダウンロード</a>

リンクしたファイルがダウンロードされます。

ダウンロードされるファイルに名前をつけたい場合

index.html
<a href="ファイル名" download="ダウンロードした後のファイル名">ファイルをダウンロード</a>

リンクするファイルのファイル名と、ダウンロードされるファイルのファイル名を変えたい場合は、download=""にファイル名を指定するとできます。

フォルダ内をまとめてダウンロードする

サーバーに上がっているファルダの中身をフォルダごとzipにまとめてダウンロードする場合、zip化するphpを叩いてダウンロードする、がシンプルかなと思います。

phpのZipArchiveクラスを使います。

zip.php
<?php

$zipName = $_GET['dl']; // 圧縮するフォルダ名

$dist = $zipName.'.zip'; // 生成する圧縮ファイル名
$path = 'フォルダまでのパス'.$zipName; // 圧縮するフォルダのパス

//DLするファイルのフォルダ構成を維持するか否か 0:しない/1:する
//維持する場合、ダウンロードしたファイルは $path の構成になります
$filePath = 0;
//DLファイルが1つの場合、フォルダに入れるか否か 0:いれない/1:いれる
$folderIn = 1;

$zip = new ZipArchive();
$zip->open($dist, ZipArchive::CREATE | ZipArchive::OVERWRITE);

if (is_dir($path)) {
    $files = array_diff(scandir($path), ['.', '..']);
    $filesNum = count($files);
    foreach ($files as $file){
        if($filePath >= 1){ //フォルダ構成を維持する
            $zip->addFile($path.'/'.$file);
        }else{ //維持しない
            if(($folderIn >= 1) && ($filesNum <= 1)){ //ファイルが1つの時、フォルダに収める場合の処理
                $localFile = $zipName.'/';
            }else{
                $localFile = '';
            }
            $zip->addFile($path.'/'.$file, $localFile.$file);
        }
    }
}
$zip->close();

// ストリームに出力
header('Content-Type: application/zip; name="' . $dist . '"');
header('Content-Disposition: attachment; filename="' . $dist . '"');
header('Content-Length: '.filesize($dist));
//echo file_get_contents($dist);
readfile($dist);

// 一時ファイルを削除しておく
unlink($dist);

exit;

?>
index.html
<a href="zip.php?dl=フォルダ名">ファイルをダウンロード</a>

圧縮するファイルにフォルダを指定していても、フォルダ内のファイルが1つしかない場合、解凍するとファイルだけ、ということが起きるので、$zip->addFileの第2引数でフォルダ内に収めるようにしています。

ダウンロードされたファイルに特定の名前などを指定したい場合も、$zip->addFileの第2引数で指定してあげると可能です。

※コメントでfile_get_contents()は、maxlenパラメータを指定しない場合対象ファイル全体をメモリに抱え込んでしまうと教えていただきましたので、出力部分をreadfile()に変更しました。

mei331
想像と創造を繰り返す黒いヒツジ。ヒツジとペンギンが好き。フルーツサンドを探しています。
https://arca-works.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした