2

アップデート

私のエラーログから見つけたreadfile() has been disabled for security reasons代わりにreadfile()?zip ファイルで動作しますかfopen?fread

================================================== ================================

私のスクリプト:

<?php

$str = "some blah blah blah blah";
file_put_contents('abc.txt', $str); // file is being created
create_zip(array('abc.txt'), 'abc.zip'); // zip file is also being created

// now creating headers for downloading that zip

header("Content-Disposition: attachment; filename=abc.zip");
header("Content-type: application/octet-stream; charset=UTF-8");    
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public");
header('Content-Transfer-Encoding: binary'); // added this line as per suggestion
header('Content-Length: ' . filesize("abc.zip")); // added this line as per suggestion
readfile("abc.zip");
//echo 'do something'; // just for testing purpose to see if code is running till the end
exit;

上記のスクリプトを実行すると、空白のページが表示されます (ダウンロード プロンプトは表示されません)。「何かをする」行のコメントを外すと、それが画面に表示されます。したがって、スクリプトは最後の行まで実行されます。

error_reporting(E_ALL)ページの上部にも配置しましたが、何も表示されません。

ここで何が欠けていますか?

4

2 に答える 2

1

Content-Lengthヘッダーを追加してみてください。完全な例については、 PHP readfile()のドキュメントを参照してください。

于 2013-09-13T08:42:10.210 に答える
0

別の方法として、 ZIPreadfile()ファイル自体へechoのリンクをクリックするだけで、ファイルを保存するように求められます。

使用:echo "<a href='$filename'>File download</a>";

PHP

<?php
$str = 'some blah blah blah blah';
$zip = new ZipArchive();
$filename = "abc.zip";

if ($zip->open($filename, ZIPARCHIVE::CREATE)==TRUE) {
$zip->addFromString("abc.txt", $str);
$zip->close();
}

echo "<a href='$filename'>File download</a>";
exit();
?>

これは通常、ファイルを ZIP してからプロンプトを開く方法です。save file as...

<?php
ob_start();
$str = 'some blah blah blah blah';

$zip = new ZipArchive();
$filename = "abc.zip";

if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
   exit("cannot open <$filename>\n");
}

$zip->addFromString("abc.txt", $str);
$zip->close();

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");

clearstatcache();
header("Content-Length: ".filesize('abc.zip'));

ob_flush();
readfile('abc.zip');
?>
于 2013-09-13T16:48:37.793 に答える