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() - ファイル名