PHP で zip 圧縮 : phpMyAdmin のライブラリ(zip.lib.php)を使う方法とPEAR の File_Archive を使用する方法


  phpMyAdmin のライブラリを使用してファイルに出力する




テストは 2.9.0 を使用しています

libraries/zip.lib.php をコピーして、以下のようにコードを書きます

  

<?
require_once('zip.lib.php');

// 圧縮するファイル
$filename1 = '夏期休暇.xls';
$filename2 = '議事録.doc';

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

// ファイルをバイナリで読んで、変数にセット
$handle = fopen($filename1, "rb");
$contents = fread($handle, filesize($filename1));
fclose($handle);

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

// ファイルをバイナリで読んで、変数にセット
$handle = fopen($filename2, "rb");
$contents = fread($handle, filesize($filename2));
fclose($handle);

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

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

// ファイルに変数から書き込む
$handle = fopen("test.zip", "wb");
fwrite($handle, $zip_buffer );
fclose($handle);

// 処理終了
print "done";
?>
  

※ rb または wb としているのは、Windows 用です
以下は、PHP マニュアルの引用です

>バイナリとテキストファイルの形式が異なるシステム(すなわち Windows)では、
>fopen()の mode パラメータに 'b' を指定してファイルをオープンする必要があります。

オリジナルの使用方法は以下のようなコードで、http ヘッダに mime 情報をセットして直接 zip でダウンロードさせます

  

if (@function_exists('gzcompress')) {
	$zipfile = new zipfile();
	$zipfile -> addFile($dump_buffer, substr($filename, 0, -4));
	$dump_buffer = $zipfile -> file();
}
  







  phpMyAdmin のライブラリを使用してダウンロードさせる




以下は、zip アーカイブをダウンロードしようとした時に IE に返ってくる情報の一例です。

lightbox.on.coocan.jp
  

HTTP/1.1 200 OK
Server: Zeus/4.2
Date: Sun, 19 Nov 2006 04:17:18 GMT
Content-Type: application/zip
Content-Length: 1294
Accept-Ranges: bytes
Last-Modified: Sat, 18 Nov 2006 13:18:33 GMT
  

AN HTTPD
  

HTTP/1.1 206 Partial Content 
MIME-Version: 1.0
Server: AnWeb/1.42k
Date: Sun, 19 Nov 2006 04:49:15 GMT
Content-Type: application/x-zip-compressed
Content-Range: bytes 8192-16537/16538
Content-Length: 8346
ETag: "455fde82-409a"
Last-Modified: Sun, 19 Nov 2006 04:33:06 GMT
Connection: close
  

さくらインターネット
  

HTTP/1.1 200 OK
Date: Sun, 19 Nov 2006 05:00:17 GMT
Server: Apache/1.3.37 (Unix)
Last-Modified: Sun, 19 Nov 2006 04:57:54 GMT
ETag: "68404d-691-455fe452"
Accept-Ranges: bytes
Content-Length: 1681
Keep-Alive: timeout=3, max=8
Connection: Keep-Alive
Content-Type: application/zip
  

以下は、ファイル化せずにダウンロードさせるコードです

  

<?
header( "Content-Type: application/octet-stream" );
header( "Content-disposition: attachment; filename=test.zip" );

require_once('zip.lib.php');

$filename1 = '夏期休暇.xls';
$filename2 = '議事録.doc';

$zipfile = new zipfile();

$handle = fopen($filename1, "rb");
$contents = fread($handle, filesize($filename1));
fclose($handle);

$zipfile -> addFile($contents, $filename1 );

$handle = fopen($filename2, "rb");
$contents = fread($handle, filesize($filename2));
fclose($handle);

$zipfile -> addFile($contents, $filename2 );

$zip_buffer = $zipfile->file();

print $zip_buffer;

?>
  

http://winofsql.jp/php/phpmyadmin_lib/output_zip.php

  PEAR の File_Archive を使用してファイルに出力する

ドキュメント

File ディレクトリ
MIME ディレクトリ
Pear.php
test.xls
test.doc
sample_01.php

以上を同じディレクトリに置いて以下( sample_01.php ) を実行する

  

<?
require_once "File/Archive.php";

// $files is an array of path to the files that must be added to the archive 

$files = array( "./test.xls", "./test.doc" );

// ****************************************************
// toArchive は、アーカイブに書き込む為の Writer で、
// アーカイブは toFiles という ファイル Writer で、ファイルに書き込まれる
// extract は、コンバータで、ファイル名より アーカイブ Writer に渡される。
// ****************************************************
File_Archive::extract( 
	$files, 
	File_Archive::toArchive("test.zip", File_Archive::toFiles( "./" )) 
); 

?>
処理終了
  

以下は、ソースにある toArchive の説明
要するに、アーカイブ名と、出力先を指定する。
上記の例での出力先は、ベースディレクトリが ./ のファイルとして出力される。

  

Compress the data to a tar, gz, tar/gz or zip format

1 string
$filename
	name of the archive file

2 File_Archive_Writer
$innerWriter
	writer where the archive will be written

3 string
$type
	can be one of tgz, tbz, tar, zip, gz, gzip, bz2,
	bzip2 (default is the extension of $filename) or any composition
	of them (for example tar.gz or tar.bz2). The case of this
	parameter is not important.

4 array
$stat
	Statistics of the archive (see stat function)

5 bool
$autoClose
	If set to true, $innerWriter will be closed when
	the returned archive is close. Default value is true.

function toArchive(
	$filename,
	&$toConvert,
	$type = null,
	$stat = array(),
	$autoClose = true
)
  

  PEAR の File_Archive を使用してダウンロードさせる

ファイルに出力されるのをブラウザ出力に変更するだけで良い

  

<?
require_once "File/Archive.php";

// $files is an array of path to the files that must be added to the archive 

$files = array( "./test.xls", "./test.doc" );

File_Archive::extract( 
	$files, 
	File_Archive::toArchive("test.zip", File_Archive::toOutput() )
); 

?>
  

http://winofsql.jp/php/pear/archive/sample_02.php

  PEAR の File_Archive を使用してソースコード上のデータをダウンロードさせる

  

<?php
require_once "File/Archive.php"; 

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

$dest->newFile("readme.txt"); 

$dest->writeData("こんにちは\n"); 
$dest->writeData("よろしくお願いします\n"); 

$dest->newFile("予定.txt"); 

$dest->writeData("明日必ず参りますので\n"); 
$dest->writeData("よろしくお願いします\n"); 

$dest->close(); 

?>
  

http://winofsql.jp/php/pear/archive/sample_03.php

  PEAR の File_Archive を使用して個別ファイルを解凍する

php_mysql.dll と php.exe がカレントディレクトリに作成されます

  

<?
require_once "File/Archive.php"; 

$src = Array(
	"php-5.1.6-Win32.zip/ext/php_mysql.dll", 
	"php-5.1.6-Win32.zip/php.exe"
);

// ファイルの解凍
File_Archive::extract( 
	$src,
	File_Archive::toFiles() 
); 

?>
Done
  





yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[phpVarious]
CCBot/2.0 (https://commoncrawl.org/faq/)
19/04/22 19:07:37
InfoBoard Version 1.00 : Language=Perl

BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube