2016-11-21 68 views
3

the PHP Flysystemパッケージを使用して、AWS S3バケットのコンテンツをストリーミングしています。特に、私は$filesystem->readStreamを使用しています。AWS S3からファイルをZipにストリームする方法

私の質問

私は、ファイルをストリーミングする場合、それはmyzip.zipで終わるとサイズが正しいですが、ときに解凍し、それはmyzip.zip.cpgzなります。ここに私のプロトタイプがあります:

header('Pragma: no-cache'); 
header('Content-Description: File Download'); 
header('Content-disposition: attachment; filename="myZip.zip"'); 
header('Content-Type: application/octet-stream'); 
header('Content-Transfer-Encoding: binary'); 
$s3 = Storage::disk('s3'); // Laravel Syntax 
echo $s3->readStream('directory/file.jpg'); 

私は間違っていますか?

サイド質問

私はこのようなファイルをストリーミングする場合は、それをしない:

  1. は完全にクライアントに転送、または
  2. はそれをしない取得し、その後、私のサーバーのRAMにダウンロードされますチャンク内に保存されてバッファに保存され、クライアントに転送されますか?

基本的に、数十GBのデータがストリーミングされていると私のサーバーに負担がかかりますか?

答えて

2

現在、directory/file.jpgの生の内容をジップとしてダンプしています(jpgはジップではありません)。これらの内容のzipファイルを作成する必要があります。代わりに

echo $s3->readStream('directory/file.jpg'); 

Zip extensionを使用してその場所に以下のことを試してみてください。

// use a temporary file to store the Zip file 
$zipFile = tmpfile(); 
$zipPath = stream_get_meta_data($zipFile)['uri']; 
$jpgFile = tmpfile(); 
$jpgPath = stream_get_meta_data($jpgFile)['uri']; 

// Download the file to disk 
stream_copy_to_stream($s3->readStream('directory/file.jpg'), $jpgFile); 

// Create the zip file with the file and its contents 
$zip = new ZipArchive(); 
$zip->open($zipPath); 
$zip->addFile($jpgPath, 'file.jpg'); 
$zip->close(); 

// export the contents of the zip 
readfile($zipPath); 

tmpfilestream_copy_to_streamを使用して、ディスク上の一時ファイルにチャンクでそれをダウンロードし、 RAMに入っていない

+0

この場合、tmpfile()とは何ですか?それは一時ファイルへのパスを取得しているはずですか? –

+1

@ mark.inman PHPの[tmpfile()]関数(http://php.net/manual/en/function.tmpfile.php) "読み書き(w +)モードで一意の名前を持つ一時ファイルを作成し、ファイルハンドルを返します。 " 一時ファイルへのパスを取得するには、[stream_get_meta_data()](http://php.net/manual/en/function.stream-get-meta-data.php)関数を実行し、戻り値の ' '$ zipPath'と' $ jpgPath'で表示されるようなuri – bradynpoulsen

関連する問題