勉強したことのメモ

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

  関連記事

ブラウザから動画ファイル名を確認できないようにPHPで動画を出力する方法

Webページ上で動画ファイルを再生したい場合、通常だとブラウザのソースコード上に ...

PHPにてSession発行時に保存されるCookieに対してHttpOnly / Secure属性を設定する方法

先日PHPのsetcookie実行時にHttpOnly / Secure属性を設 ...

PHPでデータベースを取り扱いやすくなるORMライブラリ「idiorm」の利用方法

Codeigniterでデータベースを取り扱う際にクエリビルダクラスを用いて可読 ...

PhpSpreadsheetでフォーマット用のエクセルを読み込み、指定したセルにデータを書き込んだ上で別名で保存する方法

PHPで納品書等のフォーマット用のExcelを読み込み、指定したセルにデータを書 ...

PHPで特定のサイトからのリクエストのみ受け付けて処理する方法

指定したサイトからのリクエストのみ受け付けて処理したいという状況があった。その他 ...