32

PHPでオンザフライでアーカイブを生成し、すぐに(保存せずに)ユーザーに送信しようとしています。とにかく送信しているデータは永続的ではないため、ディスク上にファイルを作成する必要はないと考えましたが、Web を検索しても方法がわかりませんでした。ファイル形式も気にしません。

したがって、質問は次のとおりです。

途中で一時ファイルを作成せずに、phpスクリプト内でメモリ内のファイルアーカイブを作成して操作することは可能ですか?

4

5 に答える 5

48

私は同じ問題を抱えていましたが、最終的にややあいまいな解決策を見つけ、ここで共有することにしました.

「libraries」ディレクトリに付属し、そこにある素晴らしいzip.lib.php/unzip.lib.phpスクリプトに出くわしました。phpmyadmin

使用zip.lib.phpすることは私にとって魅力的でした:

require_once(LIBS_DIR . 'zip.lib.php');

... 

//create the zip
$zip = new zipfile();

//add files to the zip, passing file contents, not actual files
$zip->addFile($file_content, $file_name);

...

//prepare the proper content type
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=my_archive.zip");
header("Content-Description: Files of an applicant");

//get the zip content and send it back to the browser
echo $zip->file();

このスクリプトを使用すると、ファイルを実際のファイルとして保持したり、zip 自体をファイルとして保存したりする必要なく、zip をダウンロードできます。

この機能がより一般的な PHP ライブラリの一部ではないことは残念です。

zip.lib.phpphpmyadmin ソースから のファイルへのリンクは次のとおりです。https://github.com/phpmyadmin/phpmyadmin/blob/RELEASE_4_5_5_1/libraries/zip.lib.php

更新: zip.lib.php の先頭から次のチェックを必ず削除してください。そうしないと、スクリプトが終了するだけです。

if (! defined('PHPMYADMIN')) {
    exit;
}

更新: このコードは CodeIgniter プロジェクトでも利用できます。 https://github.com/patricksavalle/CodeIgniter/blob/439ac3a87a448ae6c2cbae0890c9f672efcae32d/system/helpers/zip_helper.php

于 2012-03-10T17:27:55.367 に答える
3

アーカイブを生成するために何を使用していますか? ストリーム php://temp または php://memory を使用して、アーカイブを読み書きできる場合があります。

http://php.net/manual/en/wrappers.php.phpを参照してください。

于 2009-07-27T16:11:22.460 に答える
2

閉じるとき以外は php://temp が機能するというコメントについては、開いたままにして出力をフラッシュしてから、巻き戻して0に戻して読んでください。

その他の例については、こちらをご覧ください: http://us.php.net/manual/en/function.tmpfile.php

また、出力のバッファリングとキャプチャについても調べてください: http://us.php.net/manual/en/function.ob-start.php

于 2009-08-03T09:07:04.500 に答える
0

使用する必要がありますZipArchive::addFromString-使用する場合addFile()、ファイルを閉じるまで実際には追加されません。(恐ろしいバグ IMHO、ファイルを zip に移動しようとしていて、zip を閉じる前にそれらを削除した場合はどうなりますか...)メソッドはそれをアーカイブにすぐに追加します
addFromString()

于 2010-10-19T08:47:56.517 に答える
-7

ここに本当にパフォーマンス上の問題がありますか、それともあなたの正義感を害するだけですか? 多くのプロセスは一時ファイルを書き込んで削除しますが、キャッシュのためにディスクにヒットしないことがよくあります。

一時ファイルは閉じると自動的に削除されます。それが自然です。

メモリ内に zip ファイルを作成してそれを提供する方法は 2 つしかないと思いますが、おそらくどちらも、価値があるよりも面倒です。

  • ラムディスクを使用します。
  • ziparchive クラスを変更して、実際にファイルを閉じることを除いて、close() メソッドが行うすべてのことを行うメソッドを追加します。(または、close() に leave-open パラメーターを追加します)。
    基盤となる C ライブラリによっては、これが不可能な場合もあります。
于 2009-08-03T00:05:41.630 に答える