SQLの窓 イラストAC フリー素材

2013年11月24日

PHPでZIP圧縮 : phpMyAdmin の zip.lib.php を使う方法を 2006/08/03 に調べて記事書いてから、7年も経ってました。

こちらがその時の記事で、これはこれでそのままです。

今回 最新環境で動作確認しました。phpMyAdmin の当時のバージョンは 2.9.0 でしたが、今回は 4.0.9 です。そもそも、phpMyAdmin のライセンスは GNU GENERAL PUBLIC LICENSE Version 2 とあるのですが、今回コードを見たら単純に読み込んだら使え無いようになってました。

define("PHPMYADMIN", true);

こんな記述が必要です(zip.lib.php側でチェックを削除すればいいんですけど)。また、現在は file_get_contentsfile_put_contents があるので、簡単に記述できる上に他のサーバから読み込む事もできます。その場合は、Content-Length を取得するのに cURL 関数の処理が必要になります。

関連する記事

PHP : 指定ファイル名でダウンロード 『application/octet-stream』 と 『Content-disposition: attachment』

あと、このクラスはファイル単位でしか書庫化できません。フォルダごと行いたい場合は、やはり PEAR の File_Archive を使う必要があります。
<?php
$sep = substr( strtoupper( php_uname("s") ), 0, 7 ) == 'WINDOWS' ? ";" : ":";
set_include_path( ".$sep../pear/zip" );

require_once "File/Archive.php";

$files = array(
	 "../dotonet/RenameMdbTable"
);

$dest = File_Archive::toArchive("vbdotnet_RenameMdbTable.zip", File_Archive::toOutput() );

$dest->newFile("hanbaib.mdb"); 
$v = file_get_contents( "../upload_excel_mdb/hanbaib.mdb" );
$dest->writeData( $v ); 

File_Archive::extract( 
	$files, $dest
); 

?>

※ RenameMdbTable はフォルダです

で、zip.lib.php ではこうなります。
<?php
define("PHPMYADMIN", true);
require_once('zip.lib.php');

// 圧縮するファイル
$filename1 = 'mondai1.xlsx';
$filename2 = 'mondai2.xlsx';

// クラス作成
$zipfile = new zipfile();

// 追加
$zipfile->addFile( file_get_contents( $filename1 ), $filename1 );
$zipfile->addFile( file_get_contents( $filename2 ), $filename2 );

// zip をバイナリで変数にセット
$zip_buffer = $zipfile->file();

// ファイルに変数から書き込む
file_put_contents( "test.zip", $zip_buffer );

// メモリからダウンロードさせる
header( "Content-Type: application/octet-stream" );
header( "Content-disposition: attachment; filename=test.zip" );
header( "Content-Length: " . strlen($zip_buffer) );

// 処理終了
print $zip_buffer;
?>

test.zip をファイルとして書き込むと同時にブラウザでダウンロードさせています。


【PHPの最新記事】
posted by at 2013-11-24 02:06 | PHP | このブログの読者になる | 更新情報をチェックする