指定したディレクトリに日付付きのZipファイルを作成する方法

このQ&Aのポイント
  • 日付を使用して指定したディレクトリにZipファイルを作成する方法について説明します。
  • ファイルが保存される際に日付をファイル名に付ける方法や、エラーが発生した場合の対処法についても解説します。
  • また、ファイルをダウンロードする際のContent-Dispositionにも日付を追加する方法を説明します。
回答を見る
  • ベストアンサー

Zip名 日付

失礼します、現在指定したディレクトリにzipファイルを作成しているのですが、Zip名の頭に日付を付けたいです。 dateを使用しているのですが上手くいきませんストリームに出力する際のファイル名にdateはうまくいきましたが指定したディレクトリに保存した際のファイル名がうまくいきません。 自身でZipファイルの保存先にdateを使用してみましたがエラーが出てしまいます。 よろしくお願いします。 if(isset($_POST["upload"])){ $dir = file_zone; // Zipファイルの保存先 $file = './Zipfile/test.zip'; $root = ""; zipDirectory($dir, $file,$root); } function zipDirectory($dir, $file, $root){ $zip = new ZipArchive(); $res = $zip->open($file, ZipArchive::CREATE); if($res){ // $rootが指定されていればその名前のフォルダにファイルをまとめる if($root != "") { $zip->addEmptyDir($root); $root .= DIRECTORY_SEPARATOR; } $baseLen = mb_strlen($dir); $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS |FilesystemIterator::KEY_AS_PATHNAME |FilesystemIterator::CURRENT_AS_FILEINFO ), RecursiveIteratorIterator::SELF_FIRST ); $list = array(); foreach($iterator as $pathname => $info){ $localpath = $root . mb_substr($pathname, $baseLen); if( $info->isFile() ){ $zip->addFile($pathname, $localpath); } else { $res = $zip->addEmptyDir($localpath); } } $zip->close(); } else { return false; } header('Content-Type: application/octet-stream'); header(sprintf('Content-Disposition: attachment; filename="%s"', date(ymdhis).basename($file))); header(sprintf('Content-Length: %d', filesize($file)) ); readfile($file); }

  • PHP
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

1) $file = './Zipfile/test.zip'; ↑ここが、サーバー上に作るzipファイルのファイル名を決めているところ header(sprintf('Content-Disposition: attachment; filename="%s"', date(ymdhis).basename($file))); ↑ ここがダウンロード時の ローカル側のデフォルトのファイル名を決めているところ ですので、ダウンロードするファイル名には日時がつくけど、 サーバー上に保存したファイルのファイル名に日時がつかないのは、 そのようにプログラムで指定しているから。。。というだけのことです。 ちなみに、前者の$fileに  date()を連結するようにすると、 後者で basename($files)の前にdate()を連結されたままだと、 後者(ダウンロード時のデフォルトファイル名)には 二重に日時がついてしまいますので 前者では、 $file = './Zipfile/'.date('ymdhis'). 'test.zip'; とし 後者ではそれからディレクトリ名を外すための basename($file) のみをつかうのがよいでしょう。 2) > 自身でZipファイルの保存先にdateを使用してみましたがエラーが出てしまいます。 そのエラーのエラーメッセージがどうでたのかが、肝心です エラーの原因を調べて、ミスを修正しないかぎりプログラムは動きませんので。

losloson
質問者

お礼

ご返信ありがとうございます。無事解決できました。 回答待ちの間に出来てしまった場合どこに書き込んだらいいかわからないですね 詳しく解説してくださいましてありがとうございます。 参考にさせていただきます。

その他の回答 (2)

  • t_ohta
  • ベストアンサー率38% (5081/13277)
回答No.3

> $file = './Zipfile/date('ymdhis').zip'; これが間違いです。 文字列の中に関数を書いても実行されません。 $file = './Zipfile/' . date('ymdhis') . '.zip'; とするのが正解です。 「文字列」と「処理」の区別をちゃんとしましょう。

losloson
質問者

お礼

ご返信ありがとうございます。無事できました。

  • t_ohta
  • ベストアンサー率38% (5081/13277)
回答No.1

date() 関数で出力フォーマットを指定する場合は、string 形式で指定する必要があるので「date(ymdhis)」では無く「date('ymdhis')」になります。

参考URL:
http://php.net/manual/ja/function.date.php
losloson
質問者

補足

ご返信ありがとうございます。 現在上記とは違いますが if(isset($_POST["upload"])){ $dir = file_zone; // Zipファイルの保存先 $file = './Zipfile/date('ymdhis').zip'; $root = ""; zipDirectory($dir, $file,$root); } function zipDirectory($dir, $file, $root){ $zip = new ZipArchive(); $res = $zip->open($file, ZipArchive::CREATE); if($res){ // $rootが指定されていればその名前のフォルダにファイルをまとめる if($root != "") { $zip->addEmptyDir($root); $root .= DIRECTORY_SEPARATOR; } $baseLen = mb_strlen($dir); $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS |FilesystemIterator::KEY_AS_PATHNAME |FilesystemIterator::CURRENT_AS_FILEINFO ), RecursiveIteratorIterator::SELF_FIRST ); $list = array(); foreach($iterator as $pathname => $info){ $localpath = $root . mb_substr($pathname, $baseLen); if( $info->isFile() ){ $zip->addFile($pathname, $localpath); } else { $res = $zip->addEmptyDir($localpath); } } $zip->close(); } else { return false; } header('Content-Type: application/octet-stream'); header(sprintf('Content-Disposition: attachment; filename="%s"',basename($file))); header(sprintf('Content-Length: %d', filesize($file)) ); readfile($file); } とすると Parse error: syntax error, unexpected 'ymdhis' (T_STRING) in C:\MAMP\htdocs\upload\upload-file.php on line 127 と出てきてしまいます。一度マニュアルを参考しさせていただきます。

関連するQ&A

  • PHP Zip 開かない

    よろしくお願いします。現在ZIPにしたものをheaderで出力したいのですが、 その場で解凍した際にフォルダを開くことができません無効ですと表示されます。 原因がわからず困っています。ヒントでも頂ければ助かります。 if(isset($_POST["upload"])){ $dir = file_zone; // Zipファイルの保存先 $file = "./Zipfile/" . date("his") .'.zip'; $root = ""; zipDirectory($dir, $file,$root); } function zipDirectory($dir, $file, $root){ $zip = new ZipArchive(); $res = $zip->open($file, ZipArchive::CREATE); if($res){ // $rootが指定されていればその名前のフォルダにファイルをまとめる if($root != "") { $zip->addEmptyDir($root); $root .= DIRECTORY_SEPARATOR; } $baseLen = mb_strlen($dir); $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS |FilesystemIterator::KEY_AS_PATHNAME |FilesystemIterator::CURRENT_AS_FILEINFO ), RecursiveIteratorIterator::SELF_FIRST ); $list = array(); foreach($iterator as $pathname => $info){ $localpath = $root . mb_substr($pathname, $baseLen); if( $info->isFile() ){ $zip->addFile($pathname, $localpath); } else { $res = $zip->addEmptyDir($localpath); } } $zip->close(); } else { return false; } header('Content-Type: application/octet-stream'); header(sprintf('Content-Disposition: attachment; filename="%s"',basename($file))); header(sprintf('Content-Length: %d', filesize($file)) ); readfile($file); }

    • ベストアンサー
    • PHP
  • PHP 階層構造 維持 ディレクトリ

    現在指定したディレクトリを中にあるサブディレクトリやファイルを丸ごと階層構造を維持したまま圧縮したいのですが、うまくいきません下記のサイトを参考にしましたがエラーが出てしまいます。例外処理らしいのですが、ドキュメントを読んでもエラーの内容がうまく理解ができません よろしくお願いします。 http://php-archive.net/php/zip-directory/ エラー文 Fatal error: Uncaught Error: Call to undefined function zipDirectory() in C:\MAMP\htdocs\upload\upload-file.php:134 Stack trace: #0 {main} thrown in C:\MAMP\htdocs\upload\upload-file.php on line 134 コード define("file_zone","C:/MAMP/htdocs/upload/test/"); if(isset($_POST["download"])){ // 圧縮するディレクトリー $dir = dirname(__FILE__) . '/test/'; // Zipファイルの保存先 $file = dirname(__FILE__); zipDirectory($dir, $file); // ディレクトリを圧縮する function zipDirectory($dir, $file, $root=""){ $zip = new ZipArchive(); $res = $zip->open($file, ZipArchive::CREATE); if($res){ // $rootが指定されていればその名前のフォルダにファイルをまとめる if($root != "") { $zip->addEmptyDir($root); $root .= DIRECTORY_SEPARATOR; } $baseLen = mb_strlen($dir); $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS |FilesystemIterator::KEY_AS_PATHNAME |FilesystemIterator::CURRENT_AS_FILEINFO ), RecursiveIteratorIterator::SELF_FIRST ); $list = array(); foreach($iterator as $pathname => $info){ $localpath = $root . mb_substr($pathname, $baseLen); if( $info->isFile() ){ $zip->addFile($pathname, $localpath); } else { $res = $zip->addEmptyDir($localpath); } } $zip->close(); } else { return false; } } }

    • ベストアンサー
    • PHP
  • PHP ZIP 展開できない

    PHPで作成したZipファイルが展開できません ダブルクリックで展開すると無効ですと表示されます。 よろしくお願いします。 define("file_zone","C:/MAMP/htdocs/upload/test/"); if(isset($_POST["download"])){ $path = file_zone; $files = scandir($path); $zip = new ZipArchive($files); // Zipファイル名 $zipFileName = "file_" . date("Ymds") .'.zip'; // Zipファイル一時保存ディレクトリ $zipTmpDir = file_zone; // Zipファイルオープン $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { // 失敗した時の処理 } // 処理制限時間を外す set_time_limit(0); foreach ($files as $filepath) { $filename = basename($filepath); // 取得ファイルをZipに追加していく $zip->addFromString($filename,file_get_contents($filepath)); } $zip->close(); // ストリームに出力 header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); echo file_get_contents($zipTmpDir.$zipFileName); // 一時ファイルを削除しておく // unlink($zipTmpDir.$zipFileName); }

    • ベストアンサー
    • PHP
  • PHP zipファイルのダウンロード

    下記のようなPHPスクリプトにおいて、zip フォルダに画像ファイルの圧縮ファイルを 保存し、ダウンロードしたいんです。ダウンロードの動作はChrome上で確認できてますが、圧縮した、ダウンロードファイルのサイズが0KB で、空なのです。 どこが間違っているか教えていただけますか? [file_zip.php] <?php mb_internal_encoding("UTF-8"); $ftp = ftp_connect("~"); ftp_login($ftp, "~", "~"); $dir = '/storage2/zip'; ftp_chdir($ftp, $dir); // ディレクトリ移動 // Zipクラスロード $zip = new ZipArchive(); // Zipファイル名 $zipFileName = $_POST['zip_filename']; var_dump($zipFileName); // Zipファイル一時保存ディレクトリ $zipTmpDir = '/storage2/zip'; // Zipファイルオープン $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { // 失敗した時の処理 echo '圧縮ファイルをオープンできませんでした'; exit(); } // ここでDB等から画像イメージ配列を取ってくる $image_data_array = array(); array_unshift($image_data_array, $zipTmpDir.$zipFileName); // 処理制限時間を外す set_time_limit(0); foreach ($image_data_array as $filepath) { $filename = basename($filepath); // 取得ファイルをZipに追加していく $zip->addFromString($filename,file_get_contents($filepath)); } $zip->close(); // ストリームに出力 header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); echo file_get_contents($zipTmpDir.$zipFileName); // 一時ファイルを削除しておく unlink($zipTmpDir.$zipFileName); // header("Location: storage.php"); ?>

    • 締切済み
    • PHP
  • PHPのZipArchiveでzipが作成できない

    PHPでzipファイルを作ろうと思い、以下の手順で作成しました。 $zip = new ZipArchive(); if($zip->open('./'.$zip_file, ZipArchive::CREATE | ZIPARCHIVE::OVERWRITE) === true){ while($row = $stmt->fetch()){ // いろいろと処理 $zip->addFile($file); } $zip->close(); } すると、ループ内で行っているaddFileは返り値すべてtrueなのに対して、最後のcloseでfalseが返ってきてしまいます。 ループ処理内では画像を追加しているのですが、結構数が多いので容量の問題とかあるのでしょうか。

    • ベストアンサー
    • PHP
  • PHP 再帰的 ZipArchive

    現在サブディレクトリの中のファイルも含めZipファイルを作成していのですがうまくいきません 説明がうまくできませんが下記のサブディレクトリのtestだけが表示されファイルが取得できません。できればpath_uploadの中を階層を変えずzipで圧縮して取得したいです。 なにとぞよろしくお願いします。 path_upload----test-----test.txt |--test2.txt |--test3.txt コード define("file_zone","C:/MAMP/htdocs/upload/path_upload"); if(isset($_POST["download"])){ $path = file_zone; $files = scandir($path); $zip = new ZipArchive($files); // Zipファイル名 $zipFileName = date("Ymd") .'.zip'; // Zipファイル一時保存ディレクトリ $zipTmpDir = file_zone; // Zipファイルオープン $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { // 失敗した時の処理 } // 処理制限時間を外す set_time_limit(0); foreach ($files as $filepath) { $filename = basename($filepath); // 取得ファイルをZipに追加していく $zip->addFromString($filename,file_get_contents($filepath)); } $zip->close(); // ストリームに出力 if(ini_get('zlib.output_compression')) ini_set('zlib.output_compression', 'Off'); header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); echo file_get_contents($zipTmpDir.$zipFileName); // 一時ファイルを削除しておく // unlink($zipTmpDir.$zipFileName); }

    • ベストアンサー
    • PHP
  • ZIPを解凍するとフォルダ名が文字化けする

    いつもお世話になっております。 現在、linux上(CentOS 5.7)でディレクトリ名に日本語文字列を含むディレクトリ配下に、ファイル名に 日本語文字列を含まないファイルが複数あります。 これを、ディレクトリごとzipに圧縮してWinSCPでローカルのwindowsマシン(XP)に送って、 解凍をするとファイル名が文字化けしてしまいました。 *例* date_dir L1_A繝・・繧ソ_dir | L1_1_date.csv | L1_2_date.csv | L2_B繝・・繧ソ_dir    L2_1_data.csv **** *圧縮したもの* date_dirごとその下のディレクトリとファイルをZIPにする コマンド:zip data_dir/*/* date_dir L1_Aデータ_dir | L1_1_date.csv | L1_2_date.csv | L2_Bデータ_dir    L2_1_data.csv ************* ファイル名の文字コードを変換するには、「convmv」というのを使用すればよいみたいなのですが、 フォルダ名の文字コードの変換が出来ずに、困っております。 フォルダ名の文字化けを直す(正常に1_Aデータ_dirというフォルダが作成されるようにする)為には、 どのような方法があるのか、ご存知の方がいらっしゃいましたら、御教え頂けますでしょうか。

  • IEだと・・・だめなんです

    Zipファイルに固めてダウンロードさせようとしているのですが、Firefoxだとダウンロードできて、IEだとエラーが出てこけてしまいます。 まず、Header部分が原因だと思うのですが、原因分かる方いらっしゃいますか?教えてください。 header("Content-type: application/octet-stream"); header('Content-Disposition: attachment; filename="' . zip_file_name . '"'); header("Content-length: " . filesize($zip_file_name)); readfile($zip_file_name);

    • ベストアンサー
    • PHP
  • phpのディレクトリーorファイルのパーミッション

    お世話になります。 どうやってもうまくいかないので、質問させていただきます。 phpでログファイルを書き込むようにしたいのですが、 ファイルが作成されません。 根本的なところができていないのだと思いますが、教えてください。 やりたいことは、指定のパス(docomwnt_root配下の/logまたは include/log) にyyyymmdd.logで、テキストを書き込みたいのです。 いろいろ調べて、ディレクトリの場合は 0777、ファイルは0666にchmodすればよいとのことで 変更したのに、ファイルがないといわれてしまいます。 ソースコードは以下になります。 すみません、試行錯誤の名残とdebug行が入っています。 <?php //function logout($content){ $content="test"; error_log($content,0); //ログファイル設定 // $logpath = '/log'; // if( !is_dir($logpath) ){ // die("ディレクトリが存在しません -->". $logpath); // } //日時取得 $dateobj = new DateTime(); //アクセスタイム取得 $accessTime=$dateobj->format('Y-m-d H:i:s'); //書き込む内容 $log = $accessTime . " " . $content . "\n"; // ファイル名 $date = $dateobj->format('Ymd'); // $filename = realpath( $logpath ) . '/'.$date . '.log'; // $filename = dirname(__FILE__) . '/log/'. $date . '.log'; $filename = $date . '.log'; echo $filename; $directory_path = "./log"; if( mkdir( $directory_path, 0777) ){ echo "ok<br>"; chmod( $directory_path, 0777); } else{ echo "ng<ng>"; } if( !$fp = fopen($filename, 'ab') ){ echo "cannot open file($filename)<br>"; return -1; } if( !$fp = flock($fp, FILE_APPEND | LOCK_EX) ){ echo "cannot open file($filename)"; return -1; } if( fwrite($fp, $content) === FALSE){ echo "cannot write file($filename)<br>"; return -1; } if( !fclose($fp) ){ echo "cannot close file($filename)"; return -1; } // return 0; //} ?> この場合だと cannot open file になってしまいます。 windowsばかりやってきていたのでlinuxは、、、わかりません。 いろいろ、サンプルを試しているのですが、うまくいかなくて。。。 すみません、ご指導よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • zipフォルダの解凍

    いつもお世話になっています。 zipフォルダ実行時のことで質問します。 指定のファイルをzipフォルダに格納して、フォルダ名を指定して格納することはできました。 それで、逆に、zipフォルダにどんなファイルがあるかを確かめたいと思ったのですが、可能なのでしょうか? zipフォルダに格納できたので、それを逆に変えてしようとしたのですが、いまいちわかりません。 zipフォルダに格納したソースは以下です。 import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipOutStream_Test { public static void main(String[] args) throws Exception { File zipf = new File("D:/zip_Java.zip"); //zipファイルに埋め込むfile名 File[] files = { new File("directory.txt") }; ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipf)); try { encode(zos,files); } catch (IOException e) { }catch(Exception e) { }finally { zos.close(); } } static byte[] buf = new byte[1024]; public static void encode(ZipOutputStream zos, File[] files) throws Exception { for(File f: files) { if(f.isDirectory() ) { encode(zos, f.listFiles() ); }else { ZipEntry ze = new ZipEntry(f.getPath().replace('\\', '/')); zos.putNextEntry(ze); InputStream is = new BufferedInputStream(new FileInputStream(f)); for (;;) { int len = is.read(buf); if (len < 0) break; zos.write(buf, 0, len); } is.close(); } } } } 宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう