勉強したことのメモ

webプログラマが勉強したことのメモ。

フォームからzipファイルをアップロードしサーバ上で解凍したい

      2021/03/19

formからzipファイルをアップロードし、サーバ上で解凍したかった。またアップロードした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でファイル名を出力する。

 

注意点

ファイルサイズに注意する

zipファイルでアップロードするのでzip内に複数のファイルが入っているケースが多いと思われ、結果としてファイルサイズが大きくなりそう。

なのでphp.ini側のアップロードサイズ上限やサーバ側のHDDもしくはSSD容量に注意する必要がある。

zip側でフォーマットを決めておく必要がある

今回はとりあえずPHPでzip解凍するところまで検証したかったので、適当なテキストファイルをフォルダに突っ込み、そのフォルダをzip圧縮した。これが例えば多重構造のフォルダになっていたりすると処理が非常に面倒くさそう。

なので多重構造は禁止だとか、アップロードする側にもある程度フォーマットを決めておく必要あり。

 - PHP

  関連記事

PHPで配列じゃないものに対してソート

PHP Warning:  sort() expects parameter 1 ...

mp3ファイルのアップロードと再生方法

mp3ファイルをformでアップロードしたかったのと、Webサイト上で再生したか ...

incファイルとかtplファイルとか

初めて見るサーバーのファイルを見ていると incファイルとかtplファイルとか見 ...

PHPで配列のキーの最大値を取得する方法

配列のキーに整数値が入っていて、その中から最大値を取得したいケースがあった。調べ ...

ユーザーエージェントからブラウザ名、バージョン、OS名判別

/***判別側***/ //ブラウザ情報の取得 function browser ...

PHPで土日祝を避ける

広告物を土日祝だけ非表示にしたいと言われ、 できたらPHPで行いたかった。 調べ ...

PHPで配列に特定の値が入っているか検索

PHPで配列に特定の値が入っているか検索して trueかfalseを返したい、と ...

PHPMailerを使ってメールをSMTP送信する方法(Composer無し)

PHPでメールをSMTP送信したかった。また、レンタルサーバだったのでCompo ...

PHPで簡単にCSVファイルの生成

簡単にデータ並べるだけのCSVファイル生成。 file_put_contensで ...

includeした内容を変数に入れる

includeした内容を変数に入れる際に嵌ったのでメモ。 下記サイト様を参考にさ ...