勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPを用いてフォームからzipファイルをアップロードしサーバ上で解凍(展開)させる方法

   2024/01/16  PHP

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

  関連記事

PHP8系の環境でdBug.phpライブラリが使用できない場合の対応方法

先日メモしたdBug.phpをPHP8系の環境で試すと動作しなかった。ただエラー ...

PHPとSQLiteで簡易BBSの作成

PHPとSQLiteの練習で簡易掲示板を作ったのでメモ。   目次1 ...

PHPでCookie保存時にSameSite属性を設定する方法

あるシステムのセキュリティ対策としてCookie保存時にSameSite属性をS ...

SortableJSを使ってデータの並べ替え&保存

あるシステムを拝見した際にtableタグ内に並んでいる項目をドラッグ&ド ...

PHPで数字のプラスとマイナスを反転させる方法

PHPのプログラム内で数値のプラスとマイナスを反転させたい。以下に対応方法をメモ ...