php formからupしたzipで複数のpngファイルをゴニョゴニョしたい
zipの中身はpngファイルで、サーバー上でゴニョゴニョしたい。PNG以外でも使える内容。
作成日:2017-12-19, 更新日:2018-07-10
目標
やりたいことは、formからzipを送信されたとき、下記の流れで処理実行させたい
- zipファイルを受け取る
- 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() - ファイル名