0

私は現在次のものを持っています:

if (headers_sent()) {

    echo 'HTTP header already sent';
} else {
    if (!is_file($path)) {
        header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
        echo 'File not found';
    } else if (!is_readable($path)) {
        header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
        echo 'File not readable';
    } else {
        ob_start();
        header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
        header('Content-Description: File Transfer');
        header("Content-Type: octet-stream");
        header("Content-Transfer-Encoding: binary");
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header("Content-Length: ".filesize($path));
        header("Content-Disposition: attachment; filename=\"".basename($path)."\"");
        ob_clean();
        ob_flush();
        readfile($path);

        exit;

上記のコードは、正しいファイル名のファイルダウンロードを生成しますが、ひねりが加えられています。

ダウンロードされたファイルには、ダウンロードページからのhtmlが含まれ(ヘッダーが正しく送信されていませんか?)、ダウンロードされたドキュメントの後半に、数ページを占めるぎこちないテキスト(OJQJ ^ J。??。WW8Num2z0など)があります。最後に、.docの最後で、.docの正しいテキストのように見える英語を読むことができますが、フォーマットはありません。

これらの問題はChromeとMozillaで持続します。

どんな助けでも大歓迎です。前もって感謝します。

編集:

「test」という1行のテキストしかない.docでテストを開始しました。

ファイルは、アップロード先のディレクトリから手動で開き、破損していないことを確認できます。ただし、これまでに推奨されている方法のいずれかを使用してこのファイルをダウンロードすると、数ページのぎこちないテキストが生成されます(実際のファイルは1行のみです)。ファイルの実際のテキストである「test」は、66ページのジブリッシュの最後にあり、次の干し草の山にあります。?test? "ᄚ?ᄚ?!ᄚn" ᄚn#ミn $ ミ n3P(20???՜。 ?1Table ???????????? ᆬSummaryInformation(????? WordDocument ???????????? "$ DocumentSummaryInformation8 ???????????? [t ???????????????????

4

2 に答える 2

1

elseフラッシュ機能がない最後の抜粋については、この抜粋を試してください

header("HTTP/1.1 200 OK");
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Disposition: attachment; filename=".basename($path));
header("Content-Description: File Transfer"); 
@readfile($path); 
于 2012-11-07T03:59:58.020 に答える
1

これは何?

    header("Content-Type: octet-stream");
    header("Content-Transfer-Encoding: binary");

コードを実用的な例に切り詰め、そこから拡張します。ステータス コードを設定する必要はありません。PHP が設定します。Content-length も設定する必要はありません。これだけを送信するだけでうまくいくはずです:

$path = 'foo.dat';

if (headers_sent()) {
    echo 'HTTP header already sent';
} else {
    if (!is_file($path)) {
        header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
        echo 'File not found';
    } else if (!is_readable($path)) {
        header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
        echo 'File not readable';
    } else {
        header("Content-Disposition: attachment; filename=\"".basename($path)."\"");
        readfile($path);
    }
}
于 2012-11-07T09:10:44.643 に答える