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圧縮した。これが例えば多重構造のフォルダになっていたりすると処理が非常に面倒くさそう。
なので多重構造は禁止だとか、アップロードする側にもある程度フォーマットを決めておく必要あり。
関連記事
-
-
PHPでパーミッションの変更
chmodというみたことが無いPHP関数があったのでメモ。 ■参考サイト htt ...
-
-
PHPMailerでエンベロープFrom(Return-Path)を指定する方法
同じメールアドレスから送信したメールがmb_send_mail関数だと受信できる ...
-
-
PHPでデータをファイルキャッシュさせる(Cache_Lite)
最近携わった案件でPHPでファイルキャッシュをしているシステムがあった。今までフ ...
-
-
PHPでXML形式データをオブジェクト・JSON・連想配列に変換する方法
先日バニラJavaScriptでXML形式データの取り扱いとJSON形式への変換 ...
-
-
VONAGEとPHPでショートメッセージ(SMS)を送信する方法
PHPからショートメッセージ(SMS)を送信してみたかった。また、SMS送信は基 ...