ラボ > PHP:HTML、Javascript絡み、ファイル関連

php formからupしたzipで複数のpngファイルをゴニョゴニョしたい

zipの中身はpngファイルで、サーバー上でゴニョゴニョしたい。PNG以外でも使える内容。

作成日:2017-12-19, 更新日:2018-07-10

目標

やりたいことは、formからzipを送信されたとき、下記の流れで処理実行させたい

  1. zipファイルを受け取る
  2. zipファイルの中身の確認して、ゴニョゴニョして、サーバにup

zipファイルを受け取る

zipファイルを受け取り、拡張子が「zip」なのか確認。
※参照:PHP formタグからのファイル受け取り

if ( isset($_FILES[〇〇〇]) ) {
   $upZip = $_FILES[〇〇〇];
   
   try {
      if (isset($upZip['error']) && is_int($upZip['error'])) {
         switch ($upZip['error']) {
            case UPLOAD_ERR_OK: // OK
            break;
            
            case UPLOAD_ERR_NO_FILE:    // ファイル未選択
               throw new RuntimeException('ファイルが選択されていません');
            break;
            
            case UPLOAD_ERR_INI_SIZE:   // php.ini定義の最大サイズ超過
            case UPLOAD_ERR_FORM_SIZE:  // フォーム定義の最大サイズ超過
               throw new RuntimeException('ファイルサイズが大きすぎます');
            break;
            
            default:
               throw new RuntimeException('その他のエラーが発生しました');
            break;
         }
         
         // 速度優先のため、拡張子のチェックのみ
         if ( substr($upZip['name'], strpos($upZip['name'], '.') + 1) != 'zip' ) {
            throw new RuntimeException('zipファイルのファイル形式が未対応です');
         }
      }
      else {
         // 原因不明
         throw new RuntimeException('err unknown');
      }
   }
   catch (RuntimeException $e) {
      $message = $e->getMessage();
   }
}

zipファイルの展開

・$pathFileZip - zipファイルのPATH
・$pathDirUnZip - zipファイルの展開先のPATH

function unzip($pathFileZip, $pathDirUnZip, $file_mod = 0755) {
   $objZip = new ZipArchive();
   if ($objZip->open($pathFileZip) !== true) {
      return false;
   }
   
   $pathDirUnZip = (substr($pathDirUnZip, -1) == '/') ? $pathDirUnZip : $pathDirUnZip.'/';
   
   //// 展開先に同名ファイルがあれば、そのファイル削除
   //for ($i = 0; $i < $objZip->numFiles; $i++) {
   //   $fileName = $objZip->getNameIndex($i);
   //   
   //   $chkFile = $pathDirUnZip.$fileName;
   //   if( file_exists($chkFile ) ) {
   //      @unlink($chkFile);
   //   }
   //}
   
   // zip展開:同名ファイルがあれば上書きされる
   if ($objZip->extractTo($pathDirUnZip) !== true) {
      $objZip->close();
      return false;
   }
   
   // 展開したファイル名の取得とパーミッションの書換え
   $files = array();
   for ($i = 0; $i < $objZip->numFiles; $i++) {
      $fileName = $objZip->getNameIndex($i);
      
      $files[] = $fileName;
      
      $chkFile = $pathDirUnZip.$fileName;
      if(file_exists($chkFile)) {
         chmod($chkFile, $file_mod);
      }
   }
   $objZip->close();
   
   return $files;
}
unzip($_FILES[〇〇〇]['tmp_name']); // formでアップされているならPATHは「tmp_name」に格納されている

zipファイルの中身の確認して、ゴニョゴニョして、サーバにup

function zipUpload($pathFileZip) {
   $message = '';
   
   try {
      $objZip = new ZipArchive();
      if ($objZip->open($pathFileZip) !== true) {
         throw new \Exception('zipファイルの解凍に失敗しました');
      }
      
      // zipに含まれるファイル数
      $cntFile = $objZip->numFiles;
      
      // zipに含まれるファイル名の取得
      for ($i = 0; $i < $cntFile; $i++) {
         
         ~ 各ファイルのMIMEタイプのチェック ~
         
         // = - = - = - = - = - = - = - = - = - = - = - =
         // // ▼PNGを出力する場合
         // header( "Content-Type: image/png" );
         // echo $objZip->getFromIndex($i);
         // exit;
         
         // = - = - = - = - = - = - = - = - = - = - = - =
         // ▼PNGをゴニョゴニョしたい場合
         // ファイル自体を一時ファイルに保存
         $fp = tmpfile(); // 一時ファイルの準備
         
         fwrite($fp, $objZip->getFromIndex($i));
         
         // 一時ファイルからPATH取得
         $fmeta = stream_get_meta_data($fp);
         $imgPath = $fmeta['uri'];
         
         // PNGをゴニョゴニョする準備~出力前まで
         $original = imagecreatefrompng($imgPath);
         
         // // PNGの出力
         // header('Content-Type: image/png');
         // Imagepng( $original );
         // imagedestroy($original);
         
         ~ リサイズしたり何かしたり、どっかに保存させたり・・・ ~
         
         // 一時ファイル削除
         fclose($fp);
         
         // = - = - = - = - = - = - = - = - = - = - = - =
         // ▼ファイル名:
         // echo $objZip->getNameIndex($i);
      }
   }
   catch (\Exception $e) {
      $message = $e->getMessage();
   }
}
zipUpload($_FILES[〇〇〇]['tmp_name']); // formでアップされているならPATHは「tmp_name」に格納されている

▼似たような名前なので注意が必要
・getFromIndex() - ファイルの内容
・getNameIndex() - ファイル名

関連項目

PHP formタグからのファイル受け取り