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
  














   SQLの窓    create:2006/08/03  update:2015/09/23   管理者用(要ログイン)





フリーフォントツール

SQLの窓ツール

SQLの窓フリーソフト

写真素材

一般ツールリンク

SQLの窓

フリーソフト

JSライブラリ