目次
はじめに
仕事でデジタルブックを扱うことがあるのですが、一つのデジタルブックが数百個ファイルに分かれていてサーバーにアップロードするのに時間が掛かってしまいます。
SSHが使えるならZIPファイルをアップロードして、サーバーで解凍することでアップロード時間を短縮することができます。
残念ながら対象のサーバーはSSHが使えませんでした。
なので、PHPで代用できないかと思い作ってみました。
使い方
使い方は以下になります。
// 圧縮ファイル名を設定 // このファイルとZIPファイルを同じ階層に設置してください。 $zipfile = "file.zip"; // 許可IPリスト // 許可IPを以下のサイト等で確認して設定する // https://www.cman.jp/network/support/go_access.cgi $allowIpList = array( //'127.0.0.1' // IP例 ); if(empty($zipfile)) { header("HTTP/1.1 404 Not Found"); echo '404 Not Found'; exit; } // 接続IP $thisIp = $_SERVER['REMOTE_ADDR']; $file_path_arr = explode('/', trim($zipfile)); $zip = end($file_path_arr); $zip_file = explode('.', trim($zip)); if(end($zip_file) != 'zip' || !is_array($zip_file) || count($zip_file) != 2 || empty($zip_file) || empty($zip_file[0])) { header("HTTP/1.1 404 Not Found"); echo '404 Not Found.'; exit; } $zip_name = str_replace(array('|', '\\', '{', '}', '%', '/', '$', '', '-'), '', trim($zip_file[0])); if($zip_name != $zip_file[0] || strlen($zip_name) != strlen($zip_file[0] )) { header("HTTP/1.1 404 Not Found"); echo '404 Not Found..'; exit; } if(in_array($thisIp, $allowIpList)) { $result = unzip(sprintf("%s.zip", trim($zip_name)), './'); if($result){ echo '<h1 style="font-size:2.5rem;">作業が終わったら、このファイルの削除をお願いします。</h1>'; } else { echo 'ファイルが見つかりません'; } } else { echo '404 Not Found...'; exit; } function unzip($zip_path, $unzip_dir, $file_mod = 0755){ $zip = new ZipArchive(); if ($zip->open($zip_path) !== TRUE) return FALSE; $unzip_dir = (substr($unzip_dir, -1) == '/') ? $unzip_dir : $unzip_dir.'/'; for ($i = 0; $i < $zip->numFiles; $i++) { $getNameIndex=$zip->getNameIndex($i); if(file_exists($unzip_dir.$getNameIndex)) { @unlink($unzip_dir.$getNameIndex); } } if ($zip->extractTo($unzip_dir) !== TRUE) { $zip->close(); return FALSE; } $files = array(); for ($i = 0; $i < $zip->numFiles; $i++) { $files[] = $zip->getNameIndex($i); $getNameIndex = $zip->getNameIndex($i); if(file_exists($unzip_dir.$getNameIndex)) { chmod($unzip_dir.$getNameIndex, $file_mod); } } $zip->close(); return $files; }
まとめ
簡単に作ってみました。
やろうと思えばもうちょいカスタマイズできそうですが、自分の使用用途的にはこれで及第点です。
ぜひ使ってみてください。
今日はこの辺でー