1

サーバー上にファイルがあります。ファイルはZIPファイルです。

ファイルは、サーバーを介してクライアントにダウンロードする必要があります。

readfile 関数を使用してみましたが、ファイルをダウンロードする代わりに、奇妙なシンボルが表示されるだけです...

ここにアップロードしました: http://b-games.co.il/test/download/

これはコードです:

    $file = "2title3.gif";
if(file_exists($file))
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}

私もこれを使ってみました:

$url = 'http://example.com/some.url';
$src = fopen($url, 'r');
$dest = fopen('php://output', 'w');
$bytesCopied = stream_copy_to_stream($src, $dest);

しかし、それは同じことをしました...奇妙なシンボルを表示しただけです。

私は何を間違っていますか? http://php.net/manual/en/function.readfile.php ここでは、動作するはずだと言っています...

重要な更新:

私のローカルホストでも同じコードが機能します!

誰でも理由を知っていますか?

ありがとう!

4

4 に答える 4

3
<?php 
header('Content-disposition: attachment; filename=file.gif');
header('Content-type: image/gif');
readfile('file.gif');

このようなことを試すことができます。正しいコンテンツタイプの設定に注意してください。

于 2012-06-29T13:08:04.077 に答える
0

すでにこれはうまくいきました..

<?php
session_start();
$a=$_GET['a'];
$parts=explode("-",$a);
$tres=$parts[0];
$nombre=$partes[1];
$dbcodletra=substr($tres,2);
if($dbcod!=$_SESSION["username"])$boolt=0;
if($ext==1) $extl=".jpg";
if($ext==2) $extl=".jpeg";
if($ext==3) $extl=".tif";
if($ext==4) $extl=".tiff";
if($ext==5) $extl=".pdf";
if($ext==6) $extl=".doc";
if($ext==7) $extl=".docx";
if($tipoproy==1) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==2) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==3) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==4) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if (file_exists($dir) && $boolt) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($dir));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($dir));
    ob_clean();
    flush();
    readfile($dir);
    exit;
}else echo "<meta http-equiv=\"Refresh\" content=\"0;url=misdocumentos.php\">";
?>

php-image-file-download-by-codeから

于 2012-06-29T13:14:01.370 に答える
0

これはサーバーの問題のようです。仮想サーバーで PHP エラー レポートをオンにして、その内容をお知らせください。現時点では、機能するはずのすべてが機能しています。他のすべてが失敗した場合は、JavaScript を試してみてください。

于 2012-06-29T13:56:09.437 に答える
0

php-force-download-extensionの重複のようです。

「本当の」問題(IMHO)は、すでに出力を生成しており、コードの先頭に ob_start() がないため、 ob_clean() は何もしないことです。

編集

GIFのみをダウンロードするようにPHPを変更します

<?php
ob_start();
// put some business here 
$file = "2title3.gif";
if(file_exists($file))
{
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();

readfile($file);
exit;
}

編集2

私はあなたのサンプルコードを見て、あなたが本当にやりたいことを見つけたかもしれません. このを見てみてください。

HTTP を使用すると、リクエストごとに1 つの MIME タイプしか送信できないため、HTML 用 (例を表示) とダウンロード用 (送信ボタンを押す) の 2 つのリクエストが必要です。

于 2012-06-29T13:17:46.077 に答える