LoginSignup
5

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-18

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

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

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

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()に変更しました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5