PHPを用いてフォームからzipファイルをアップロードしサーバ上で解凍(展開)させる方法
2024/01/16
formからzipファイルをアップロードしサーバ上で解凍(展開)するという一連の処理をPHPで行いたい。また、アップロードしたzipファイルは削除、解凍したファイルは同名にならないよう指定したディレクトリ内に展開したい。以下に実装方法をメモ。
HTML部分
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST" enctype="multipart/form-data">
<input type="file" name="zip">
<input type="submit">
</form>
PHP部分
<?php
$dir = __DIR__ . '/';
//ファイルが送信された場合
if( $_FILES['zip']['size'] > 0 ){
$zip_name = md5(uniqid(rand(), true)) . '_' . time();
$zip_file = $zip_name . '.zip';
//サーバにアップロード
if( move_uploaded_file($_FILES['zip']['tmp_name'], $dir . $zip_file) ){
$zip = new ZipArchive;
if($zip->open($zip_file) === TRUE){
$zip->extractTo($dir . $zip_name);
$zip->close();
echo 'OK';
//zipファイルの削除
unlink($zip_file);
//展開されたフォルダ内にあるディレクトリを検索
$dirs = scandir($dir . $zip_name . '/');
//ディレクトリを決め打ち(0->'.', 1->'..'になる)
$tmp_dir = $dir . $zip_name . '/' . $dirs[2] . '/*';
foreach(glob($tmp_dir) as $file){
if(is_file($file)){
var_dump($file);
}
}
}else{
echo '解凍エラー';
}
}else{
echo 'アップロードエラー';
}
}
?>
基本的にはコメントの通りだがファイルが送信された場合にサーバにアップロードし、zipファイルを解凍。その後、zipファイルは削除し指定したディレクトリ内に展開する。展開したディレクトリ内にあるファイルを検索し、var_dumpでファイル名を出力する。
また、ZipArchveクラスに関してはリファレンスを参照。
注意点
ファイルサイズに注意する
zipファイルでアップロードするのでzip内に複数のファイルが入っているケースが多いと思われ、結果としてファイルサイズが大きくなりそう。
なのでphp.ini側のアップロードサイズ上限やサーバ側のHDDもしくはSSD容量に注意する必要がある。
zip側でフォーマットを決めておく必要がある
今回はとりあえずPHPでzip解凍するところまで検証したかったので、適当なテキストファイルをフォルダに突っ込み、そのフォルダをzip圧縮した。これが例えば多重構造のフォルダになっていたりすると処理が非常に面倒くさそう。
なので多重構造は禁止だとか、アップロードする側にもある程度フォーマットを決めておく必要あり。
関連記事
-
-
Facebookのタイムラインを取得して表示する方法
Facebookのタイムラインを取得してきて、表示させたいという案件があった。 ...
-
-
PHPMailerを使ってメールをSMTP送信する方法(Composer無し)
PHPでメールをSMTP送信したかった。また、レンタルサーバだったのでCompo ...
-
-
Fatal error: Cannot redeclare 関数名のエラー
PHPにて「Fatal error: Cannot redeclare 【関数名 ...
-
-
PHPでdo-while(0)構文を利用する際のメリット
あるソースコード上にdo-whileという構文が使われていた。見たことのない構文 ...
-
-
PHPにて「ImageHash」ライブラリを使用し画像の類似度を算出する方法
以前にPHPの「image-comparator」ライブラリで画像の類似度を算出 ...