PHPでサーバーのZIPファイルを展開する

はじめに

仕事でデジタルブックを扱うことがあるのですが、一つのデジタルブックが数百個ファイルに分かれていてサーバーにアップロードするのに時間が掛かってしまいます。

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;
}

 

まとめ

簡単に作ってみました。

やろうと思えばもうちょいカスタマイズできそうですが、自分の使用用途的にはこれで及第点です。

ぜひ使ってみてください。

 

今日はこの辺でー

  • この記事を書いた人

カバノキ

印刷会社のWEB部隊に所属してます。 WEB制作に携わってから、もう時期10年になります。 普段の業務では、PHPをメインにサーバーサイドの言語を扱っています。 最近のお気に入りはJavascriptです。 Vue.jsを狂喜乱舞しながら、社内に布教中です。

-PHP
-