PHP:複数枚の画像をZIPに圧縮してダウンロードする
複数枚の画像をZIPに圧縮してダウンロードするPHP
親会社のWEBカタログ作成時にハマったので備忘録的メモ。
参考にさせて頂いたサイトさんのテキストが間違えていまして、自分で書いてないのでその事に気づかず、延々悶々としていたという...。まぁよくある事ですね。
画像をZIP化してダウンロードするスクリプト
流れは以下の通り
- ダウンロードする画像を選択しDL用ページへPOST送信
- DL用ページでPOST受取
- new ZipArchive() で空のzipファイルを作成
- zip化するパーツに addFile で データを追加
- zip化するパーツをcloseする
- header でダウンロード指示
- 作成したzip を削除する
//配列 $pict の中身
$pict[] = dirname(__FILE__)."/image/〇〇〇.jpg";
$pict[] = dirname(__FILE__)."/image/△△△.jpg";
$pict[] = dirname(__FILE__)."/image/■■■.jpg";
$pict[] = dirname(__FILE__)."/image/◇◇◇.jpg";
//画像パスを配列でPOST
//inputをつくる
foreach($pict as $row){
$d_list[] = '<input type="hidden" name="p_path[]" value="'.$row.'">';
}
//作成したinputを文字列にする
$PPATH = implode("\n",$d_list);
//form タグを作成
$DL_LIST = '<form method="POST" action= "d_pict.php" target="blank">'."\n"
.$PPATH.
'<input type="submit" value="画像ダウンロード">'."\n0"
. '</form>'."\n";
//作成した foam をコール
echo $DL_LIST;
受取:d_pict.php
<?php
//POSTの取得
$pict = $_POST['p_path'];
//後のためにPOSTされた配列の数を数える
$ct = count($pict);
//パスやファイル名の設定
$zip_name = 'pict_zip_'.date('Ymd').'.zip';
$zip_tmp_dir = dirname(__FILE__).'/tmp_zip/';
//ZIPデータの作成
//---------------------------------------------
//ZipArchiveインスタンス作成
$zip_obj = new ZipArchive();
$result = $zip_obj -> open($zip_tmp_dir.$zip_name, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if(!$result){
echo 'error code : '.$result;
exit();
}
//zipにまとめたいファイルのパスとzip内でのファイルパスを配列にまとめる
for ($i = 0; $i < $ct; $i++) {
$fname = "画像名".'_'.$i.'.jpg';
$files[] = array('zip_path' => $fname,'file_path' => $path);
}
//zip ファイルに画像を追加する
foreach ($files as $file){
$zip_obj -> addFile($file['file_path'], $file['zip_path']);
}
//zip ファイルを閉じる
$zip_obj -> close();
//ダウンロード指示
//---------------------------------------------
header('Content-Type: application/force-download;');
header('Content-Length: '.filesize($zip_tmp_dir.$zip_name));
header('Content-Disposition: attachment; filename="'.$zip_name.'"');
readfile($zip_tmp_dir.$zip_name);
//作成したサーバー内のzipを削除
//---------------------------------------------
unlink($zip_tmp_dir.$zip_name);
?>
人の書いたコードをパクろうとしたため、作成したZIPのパスとダウンロード指示で書いてるZIPのパスが違うというお手本のミスをそのまま引き継ぎ延々と空のZIPがダウンロードされ大ハマり。
大体ね、script組んでてハマる時ってちっちゃなミスに気付かない時なんだよね。
次回からは気を付けます。はい。


