PHP:複数枚の画像をZIPに圧縮してダウンロードする

複数枚の画像をZIPに圧縮してダウンロードするPHP

親会社のWEBカタログ作成時にハマったので備忘録的メモ。
参考にさせて頂いたサイトさんのテキストが間違えていまして、自分で書いてないのでその事に気づかず、延々悶々としていたという...。まぁよくある事ですね。

画像をZIP化してダウンロードするスクリプト

流れは以下の通り

  1. ダウンロードする画像を選択しDL用ページへPOST送信
  2. DL用ページでPOST受取
  3. new ZipArchive() で空のzipファイルを作成
  4. zip化するパーツに addFile で データを追加
  5. zip化するパーツをcloseする
  6. header でダウンロード指示
  7. 作成した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組んでてハマる時ってちっちゃなミスに気付かない時なんだよね。

次回からは気を付けます。はい。

 

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください