web-dev-qa-db-ja.com

ファイルをディスクに書き込まずにPHPクラスZipArchiveを使用してZipファイルを作成しますか?

ZipArchive(またはネイティブPHPクラス))を使用してメモリ内にZipファイルを作成し、ファイルの内容をクライアントに読み戻したいのですが、可能ですか?

このアプリケーションで圧縮したいファイルは、合計で最大15MBです。記憶的には良い状態にあるべきだと思います。

23
CLJ

次のライブラリを見てください。Zipファイルを作成してストリームとして返すことができます: PHPClasses.org

4
Cpt. eMco

ZipStream (GitHubリポジトリへのリンク、 Composer 経由のインストールもサポート)を試してください。

元の作者のウェブサイトから(現在は死んでいます):

ZipStreamは、サーバー上のディスクにまったく書き込むことなく、PHPから動的Zipファイルを動的にストリーミングするためのライブラリです。

4
Frosty Z

素晴らしいライブラリZipStream-PHPを提供してくれたFrostyZに感謝します。 pload S3までの量とサイズの大きなZipファイルの使用例があります。公式ドキュメントには、S3へのアップロード方法については記載されていません。

そのため、サーバー上にZipファイルを作成せずに、ZipStream出力によって作成されたZipをS3に直接ストリーミングするというアイデアがありました。

これが私たちが思いついた実用的なサンプルコードです:

<?php
# Autoload the dependencies
require 'vendor/autoload.php';

use Aws\S3\S3Client;
use ZipStream\Option\Archive as ArchiveOptions;

//s3client service
$s3Client = new S3Client([
    'region' => 'ap-southeast-2',
    'version' => 'latest',
    'credentials' => [
        'key' => '<AWS_KEY>',
        'secret' => '<AWS_SECRET_KEY>',
    ]
]);
$s3Client->registerStreamWrapper(); //required

$opt = new ArchiveOptions();
$opt->setContentType('application/octet-stream');
$opt->setEnableZip64(false); //optional - for MacOs to open archives

$bucket = 'your_bucket_path';
$zipName = 'target.Zip';

$Zip = new ZipStream\ZipStream($zipName, $opt);

$path = "s3://{$bucket}/{$zipName}";
$s3Stream = fopen($path, 'w');

$Zip->opt->setOutputStream($s3Stream); // set ZipStream's output stream to the open S3 stream

$filePath1 = './local_files/document1.Zip';
$filePath2 = './local_files/document2.Zip';
$filePath3 = './local_files/document3.Zip';

$Zip->addFileFromPath(basename($filePath1), $filePath1);
$Zip->addFileFromPath(basename($filePath2), $filePath2);
$Zip->addFileFromPath(basename($filePath3), $filePath3);

$Zip->finish(); // sends the stream to S3
?>
2
Terry Truong

これについて話している別のスレッドがあります: PHP(ディスク上に一時ファイルを作成せずに) でメモリ内のアーカイブを操作します

nettleは、 phpmyadmin からZip.lib.phpを使用することを提案しています。これはかなり固溶体だと思います。

参考までにZip.lib.phpはもう存在せず、ZipFile.php同じlibrary /フォルダー内。

0
Shunzhe