0

ダウンロード.php

} else {
    $filename = NULL;
}

$err = '<div align="center">GREEK error msg</div>';

if (!$filename) {
    // if variable $filename is NULL or false display the message
    echo $err;
} else {
    // define the path to your download folder plus assign the file name
    $path = '../downloads/'.$filename;

    // check that file exists and is readable
    if (file_exists($path) && is_readable($path)) {
        // get the file size and send the http headers
        $size = filesize($path);
        header('Content-Type: application/octet-stream;');
        header('Content-Length: '.$size);
        header('Content-Disposition: attachment; filename='.$filename);
        header('Content-Transfer-Encoding: binary');
        // open the file in binary read-only mode
        // display the error messages if the file can´t be opened
        $file = @ fopen($path, 'rb');
        if ($file) {
            // stream the file and exit the script when complete
            fpassthru($file);
            exit;
        } else {
            echo $err;
        }
    } else {
        echo $err;
    }
}
?>

これが私がそれを呼ぶ方法です:

<a href="scripts/download.php?file=GREEKCHARS_Earth.pdf"></a>
  1. ファイル名が英語の場合、ダウンロード スクリプトは問題なく動作します。
    ファイル名がギリシャ語の場合、エラー メッセージが表示されます。

  2. $filenameをecho すると正しいギリシャ語名が表示されるので、正しい名前が download.php に渡されていると思います。

  3. $filename で正しい名前を取得し、実際のファイルも同じ名前を持っているため、スクリプトがファイルのダウンロードに失敗し、エラー メッセージが表示されるのはどこですか?

ギリシャ語の $filename と実際のファイルの一致に失敗しているようです。

4

1 に答える 1

2

問題は、HTTP ヘッダーに ASCII 文字しか含まれていない可能性があることです。これが標準です。ヘッダーは、どのコンテンツがどのエンコーディングで続くかを定義するためにあるため、ヘッダー自体には、まだ指定されていないエンコーディングの文字を含めることはできません。

ヘッダーで非 ASCII シンボルを送信するには、RFC 2231 に従ってエンコードする必要があります
。こちらの回答を参照してください: RFC 2231 に従って PHP でファイル名をエンコードするにはどうすればよいですか?

于 2012-11-22T07:18:37.623 に答える