目次
はじめに
仕事でデジタルブックを扱うことがあるのですが、一つのデジタルブックが数百個ファイルに分かれていてサーバーにアップロードするのに時間が掛かってしまいます。
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;
}
まとめ
簡単に作ってみました。
やろうと思えばもうちょいカスタマイズできそうですが、自分の使用用途的にはこれで及第点です。
ぜひ使ってみてください。
今日はこの辺でー