0

一部のユーザーから、ファイルをダウンロードできないという報告を受けています。

これは、ダウンロード カウンター ファイル内のスクリプトです。

<?php
$id = $_GET['id'];
require('conn.php');
$stmt = write_conn()->prepare("UPDATE links SET dl_count = dl_count + 1 WHERE ID=" . $id);
$stmt->execute();
header('Location: ' . $row['mp3_url'] );
?>

Header()ユーザーをダウンロード リンクにリダイレクトする機能を使用すると、いくつかの制限があり、IE ではうまく動作しないと聞きました。そうですか?

これを行う正しい方法は何ですか?

4

3 に答える 3

0

header(Location: ...) IE6 には確かにいくつかの問題があり、おそらくそれ以降のバージョンでも問題があります。

生成された文字列 (リンク) の URL デコードを試みます。IE では、URL エンコードされたヘッダー (場所: ...) のリンク文字列に問題があるようです。

また、ヘダーの後に必ず終了してください...

出口;

于 2012-09-27T14:45:10.263 に答える
0
header('Content-Disposition: attachment; filename="'.$fileName.'"');
header('Content-Type: application/force-download');
header('Content-Type: application/octet-stream');
ob_flush();
readfile($row['mp3_url']);
exit;
于 2012-09-27T14:45:28.703 に答える
0

多くのテストと試行を調査して試した後、header()機能に関するいくつかの事実readfile()や類似の事実を発見しました。

  1. まず、header()さまざまなブラウザとの互換性の問題があることを知っておく必要があります。したがって、完璧な機能を探そうとしないでください。問題はphp関数ではなく、ダウンロードヘッダーを分析する方法が異なるブラウザーであるため、すべてのブラウザーが異なる動作をします。ご存知かもしれませんが、最大のトラブルメーカーは IE です。

  2. 問題を修正して を使用して機能させたい場合はheader()、いくつかのヘッダーの詳細 ( など) を追加/強制する必要がありますがContent-Type、これは php コードでは不可能です。何度やっても、なかなかうまくいきません。これについてはあまり情報がありませんがContent-Type、実際の前にヘッダーを追加しても機能しないことはわかっていますheader()。それらは完全に異なる目的のためのようです。

  3. 必要なヘッダーを追加してreadfile()代わりに関数を使用すると、正常に機能します。ただし、この関数は、呼び出しているファイル/URL をメモリにロード/読み取ることを知っておく必要があります。これは大きな問題になる可能性があり、Web サーバーの速度が低下する可能性があります。最悪の場合、クラッシュすることもあります。これは、ダウンローダーが多すぎるか、ファイルが多い場合に発生する可能性があります。

残念ながら、前に述べたように、php コードでこれを修正することはできません。この問題を解決するために私がしたことは、Web サーバー vhost にヘッダーを追加することでした。

NginX:

location ~ ^/.*\.mp3$ {
        add_header Pragma "public";
        add_header Expires "0";
        add_header Cache-Control "must-revalidate, post-check=0, pre-check=0";
        add_header Content-Disposition "attachment";
        add_header Content-Type "application/force-download";
        add_header Content-Type "application/octet-stream";
        add_header Content-Type "application/download";
        add_header Content-Transfer-Encoding "binary";
        }

私の場合、ユーザーがダウンロードする必要のあるファイルは mp3 形式でした。ただし、それを変更したり、グローバル ディレクティブを設定したりして、任意の形式で動作できるようにすることができます。

于 2012-11-10T10:38:23.403 に答える