1

ファイルをダウンロードする直前に PHP で HTML ページを表示しようとしています。別のページにリダイレクトして同時にファイルをダウンロードできないことは理解していますが、なぜうまくいかないのでしょうか?

echo "<html>...Example web page...</html>";

$download = '../example.zip'; //this is a protected file

header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename=example.zip');
readfile($download);

ファイルはダウンロードされますが、エコーされる HTML ページは表示されません。しかし、ダウンロードを削除すると、ページが表示されます。

4

4 に答える 4

1

コンテンツがブラウザーに送信された後にヘッダー情報を設定することはできません。実際にダウンロードを取得している場合は、どこかで出力キャッシュが行われている可能性があります。

達成しようとしていることについては、HTML コンテンツを表示し、<meta>タグまたは JavaScript を使用してダウンロード スクリプトにリダイレクトすることをお勧めします。ほとんどのブラウザーは、最後にロードされたページをユーザーに表示したままダウンロードを開始すると思います (これは基本的に、あなたがやりたいことです)。

<meta http-equiv="refresh" content="1;URL='http://example.com/download.php'">

または:

<script type="text/javascript">
  window.location = "http://example.com/download.php"
</script>
于 2012-08-10T03:06:12.873 に答える
0

簡単な原則があります:

実際の出力が送信される前に、通常の HTML タグ、ファイル内の空白行、または PHP から header() を呼び出す必要があることに注意してください。

解決策は、html コンテンツの表示用とダウンロード用の 2 つのページを用意することです。

ページ 1 で、javascript を使用してタイマーを設定し、数回後にダウンロード リンクにリダイレクトします。

たとえば、「5 秒後にダウンロードが開始されます。」.

于 2012-08-10T03:03:58.237 に答える
0

カスタム ヘッダーをプッシュする前に何も出力できないため、JS を使用してダウンロードにリダイレクトすることをお勧めします。これにより、通常は同じページに留まります (zip コンテンツを破棄するだけで他には何もない限り)。

だから、これを試してください:

$download = 'example.zip';

echo '<head> <script type="text/javascript"> function doRedirect(){window.location = "'.$download.'"}</script>

</head><html><script type="text/javascript"> doRedirect() </script> <...Example web page...</html>';

または、タイマーが必要な場合:

echo '<head> <script type="text/javascript"> function doRedirect(){window.location = "'.$download.'"}</script>

</head><html><script type="text/javascript"> 
setTimeout(doRedirect(),1000);//wait one second</script> <...Example web page...</html>';

編集:

ファイル パスを隠したい場合は、JS がリダイレクトするダウンロード スクリプトを作成することをお勧めします。

したがって、基本的には、自分が行っていることを正確に実行してから、JS を使用してそれを指すようにします。このような:

ダウンロード.php:

//use an ID or something that links to the file and get it using the GET method (url params)

    $downloadID = $_GET['id'];

    //work out the download path from the ID here and put it in $download
if ( $downloadID === 662 )
{
    $download = 'example.zip';//...
 }   
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename=$download');
    readfile($download);

次に、メインの HTML ファイルで、JS を使用して、正しい ID でそれをポイントします。

<head> <script type="text/javascript"> function doRedirect(){window.location = "Download.php?id=662"}</script>

</head><html><script type="text/javascript"> doRedirect() </script> <...Example web page...</html>
于 2012-08-10T03:14:59.603 に答える
0

既に述べたように、出力が既に送信された後にヘッダーを送信することはできません。

したがって、これはあなたのために働くかもしれません:

header('Refresh: 5;URL="http://example.com/download.php"');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename=example.zip');
readfile($download);

http-equivinはHTTPヘッダーと同等であることを意味するため、ヘッダーと同じことを行い<meta http-equiv="refresh"ます。namevalueRefresh:

SourceForgeから任意のファイルをダウンロードすると、JavaScript の実装 ( Your download will start in 5 seconds...) が表示されます。

于 2012-08-10T03:15:28.717 に答える