12

PHP ベースの Web サイトで、ユーザーが短いフォームに入力した後にダウンロード パッケージを送信したいと考えています。サイトが開始するダウンロードは、「すぐにダウンロードを開始します」と表示される download.com などのサイトに似ている必要があります。

私が知っているいくつかの可能なアプローチと、ブラウザーの互換性 (簡単なテストに基づく):

1)window.open新しいファイルを指定します。

- FireFox 3 blocks this.  
 - IE6 blocks this.  
 - IE7 blocks this.

2) 新しいファイルを指す iframe を作成します。

- FireFox 3 seems to think this is OK. (Maybe it's because I already accepted it once?)  
 - IE6 blocks this.  
 - IE7 blocks this.

How can I do this so that at least these three browsers will not object? 

おまけ: ブラウザ条件ステートメントを必要としない方法はありますか?

(download.com は条件付きで両方の方法を採用していると思いますが、どちらも機能させることはできません。)

回答と説明:

Q: "Why not point the current window to the file?"  
A: That might work, but in this particular case, I want to show them some other content while their download starts - for example, "would you like to donate to this project?"

更新:私はこのアプローチを放棄しました。理由については、以下の私の回答を参照してください。

4

11 に答える 11

16

ほとんどのブラウザーがサポートしているメタ リフレッシュを実行することもできます。Download.com は noscript タグに配置します。

<meta http-equiv="refresh" content="5;url=/download.php?doc=123.zip"/>
于 2008-09-13T15:18:14.707 に答える
15

更新: このアプローチを放棄し、代わりに実際のファイルへのリンクをユーザーに提示することにしました。私の推論は次のとおりです。

サーバーが開始するダウンロードの最初の試みは、ブラウザーによってブロックされました。「ブラウザは正しい。これが正当なダウンロードであることをどのように判断するのでしょうか明らかにユーザーが開始したものではないダウンロードをブロックする必要があります。」

サーバーが開始するダウンロードに使用できる方法は、マルウェアを送信したい人にも使用される可能性があります. したがって、ダウンロードは、ユーザーがリンクをクリックしてファイルを要求した場合にのみ実行する必要があります。

同意しないのは自由です。それでもダウンロードを開始したい場合は、このスレッドが役立つことを願っています。

于 2008-09-16T14:52:18.050 に答える
5

私は通常、適切なコンテンツタイプでファイルをブラウザに直接出力するPHPスクリプトを持っています

if(file_exists($filename)) {
    header("Pragma:  public");
    header("Expires:  0");
    header("Cache-Control:  must-revalidate, pre-check=0");
    header("Cache-Control:  private", false);
    header("Content-Type:  " . $content-type);
    header("Content-Disposition:  attachment; filename=\"" . basename($filename) . "\";" );
    header("Content-Transfer-Encoding:  binary");
    header("Content-Length:  " . filesize($filename));

    readfile("$filename");
}else{
    print "ERROR:  the file " . basename($filename) . " could not be downloaded because it did not exist.";
}

唯一の欠点は、これにより HTTP ヘッダーが設定されるため、他の出力が得られる前に呼び出されることです。

ただし、PHP ダウンロード ページへのリンクを設定することはできます。これにより、現在のページのコンテンツを台無しにすることなく、ブラウザにダウンロード ボックスがポップアップ表示されます。

于 2008-09-13T15:13:45.717 に答える
1

問題の 1 つは、ヘッダーが「正しく」設定されていない場合、IE (特にバージョン 6) で問題が発生する可能性があることです。

正しい Content-Type を設定していることを確認しますが、IE のキャッシュ オプションを設定して (少なくとも) キャッシュを許可することも検討してください。ファイルがユーザーが保存するのではなく開くことができるファイル (MS Word 文書など) の場合、初期バージョンの IE はファイルをキャッシュする必要があります。これは、ダウンロードされたファイルを指す「開く」要求を該当するアプリに渡すためです。キャッシュ内。

関連する問題もあります。IE6 ユーザーのキャッシュがいっぱいの場合、ファイルが適切に保存されません (したがって、該当するアプリがそのファイルを開くためにハンドオフを取得すると、ファイルが破損しているとのメッセージが表示されます。

また、ダウンロード時に gzip アクションを無効にすることもできます (IE の場合)。

IE6/IE7 の両方に大規模なダウンロード (4.x ギグなど) に関する問題がありますが、IE にはダウンロード マネージャーさえないため、ありそうなシナリオではありませんが、注意が必要です。

最後に、ネストされた iframe 内からダウンロードが開始された場合、IE6 はダウンロードの「プッシュ」を適切に処理しないことがあります。何が原因で問題が発生するのか正確にはわかりませんが、IE6 を使用すると、このシナリオを回避しやすくなります。

于 2008-09-15T13:32:27.020 に答える
1

ホイ!

@ネイサン:私はまさにそれを行うことにしました:「getfile.php」に必要なものをすべてロードさせてから、

header("Location: ./$path/$filename");

ブラウザ自体に、ファイルに対して正しいと思われることを直接実行させる。これは、私と一緒に Opera でも問題なく動作します。

しかし、これは、ファイルへの直接アクセスが許可されていない環境では問題になります。その場合、別の方法を見つける必要があります。(Discordia に感謝します。私のファイルは公開 PDF です!)

よろしく、バスティ

于 2008-09-22T13:03:01.733 に答える
0

現在のウィンドウをダウンロードに向けないことについて。私の経験では、ダウンロードは (正しいヘッダーを送信する限り) 実際にはブラウザー ウィンドウを更新しないため、「寄付してください」ページを表示できます。私は自分のサイトの 1 つで csv エクスポートに対してこれを行います。ユーザーに関する限り、安全なファイル ウィンドウがポップアップ表示されます。Soldarnalが示したように、単純なメタリダイレクトをお勧めします。

于 2008-09-15T11:56:47.700 に答える
0

新しいファイルを指すように場所を変更するのはどうですか? (例: window.location を変更)

于 2008-09-13T15:06:41.770 に答える
0

私は常にファイルを指す iframe を作成しました。

<iframe src="/download.exe" frameborder="0" height="0" width="0"><a href="/download.exe">Click here to download.</a></iframe>
于 2008-09-13T15:37:52.240 に答える
0
<a href="normaldownload.zip" onclick="use_dhtml_or_ajax_to_display_page()">

Current page is unaffected if download is saved. Just ensure that download doesn't open in the same window (proper MIME type or Content-Disposition) and you'll be able to show anything.

See more complete answer

于 2009-04-07T23:40:30.300 に答える
0

要約すると、2 つの目標があります。

  1. ダウンロードプロセスを開始する
  2. 寄付オプションのあるページをユーザーに表示する

これを達成するために、私は次のことを行います:

ユーザーがフォームを送信すると、寄付オプションと、ダウンロードが 5 秒後に開始されるというテキストを含むページが表示されます。そして、このページの head セクションに、Soldarnal が言ったように META コードを入れます: <meta http-equiv="refresh" content="5;url=/download.php?doc=123.zip>

それだけです。

于 2008-09-15T12:49:01.490 に答える