0

ダウンロードリンクをいくつか作成しています。私の問題は、「MY_FILE_NAME.doc」ファイルが英語の文字を使用して保存されている場合、ダウンロードしていることです。ギリシャ文字を使用して保存すると、ダウンロードできません... utf-8 エンコーディングを使用しています。

(問題があるかどうかはわかりませんが、ページ全体にギリシャ文字を問題なく表示しています)

これが私のリンクです:

<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CFS Portal</title>
</head>
<body>
<div>
<span class="txt">
<a href="scripts/download.php?file=MY_FILE_NAME.doc" class="dload">Ιατρικό</a>
</span></div>
</body>

そして私のdownload.phpファイル:

<?php
// block any attempt to the filesystem
if (isset($_GET['file']) && basename($_GET['file']) == $_GET['file']) {
    $filename = $_GET['file'];
} else {
    $filename = NULL;
}

$err = '<p class="err_msg">
STOP / ΣΤΑΜΑΤΗΣΤΕ
</p>';

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;
        }
    }
?>
4

2 に答える 2

2

スクリプトにいくつかの問題がある可能性があります。

1.ファイルシステムのエンコーディングの問題

ファイルシステム上のファイルに実際にアクセスするには、ファイル名を適切にエンコードする必要があります。LC_CTYPEロケールパラメータは、ディスク上のファイル名の予想されるエンコーディングを示します。

Unix / Linuxまたは同様のオペレーティングシステムでは、そのパラメータは「en_US.UTF-8」のように評価される場合があります。これは、ファイル名のエンコーディングがUTF-8であるため、スクリプトで変換する必要がないことを意味します。

WindowsサーバーではUTF-8は許可されておらず、通常、LC_CTYPEは「language_country.codepage」のように評価されます。「codepage」は現在アクティブなコードページの番号です。たとえば、1252(西側諸国)または1253(ギリシャ語)です。ここでhttp://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/は、Windowsで使用可能なコードページのリストです。次に、Windowsでは、UTF-8ファイル名をディスクから読み取るために別の名前に変換する必要があります。詳細については、PHPのバグ番号への返信をご覧ください。47096はhttps://bugs.php.net/bug.php?id=47096で入手できます。

2.HTTPファイル名のエンコードの問題

私の経験では、ブラウザが異なれば、非ASCIIファイル名をエンコードする方法も異なり、特殊文字や無効な文字が存在する場合の動作も異なります(たとえば、Windowsでは、ファイル名に疑問符「?」は使用できません。また、ブラウザは単純にその文字を削除するか、ファイル名全体をランダムに生成された別の文字に完全に置き換えます)。とにかく、次のコードのチャンクはほとんどのブラウザで機能します。

    $file_name="CafféBrillì.pdf"; #ファイル名、UTF-8エンコード
    $ file_mime = "application / pdf"; #MIMEタイプ
    $ file_path="絶対/または/相対/パス/ファイル";

    header( "Content-Type:$ file_mime");
    header( "Content-Length:" .filesize($ file_path));
    $ agent = $ _SERVER ["HTTP_USER_AGENT"];
    if(is_int(strpos($ agent、 "MSIE"))){
        #予約済みの文字を削除します:: \ / *? "|
        $ fn = preg_replace('/ [:\\ x5c \\ / *? "|] /'、'_'、$ file_name);
        #非標準のURLエンコード:
        header( "Content-Disposition:attachment; filename ="
        。rawurlencode($ fn));

    } else if(is_int(strpos($ agent、 "Gecko"))){
        #RFC 2231:
        header( "Content-Disposition:attachment; filename * = UTF-8''"
        。rawurlencode($ file_name));

    } else if(is_int(strpos($ agent、 "Opera"))​​){
        #予約済みの文字を削除します:: \ / * {?
        $ fn = preg_replace('/ [:\\ x5c \\ / {?] /'、'_'、$ file_name);
        #RFC 2231:
        header( "Content-Disposition:attachment; filename * = UTF-8''"
        。rawurlencode($ fn));

    } そうしないと {
        #RFC 2616 ASCIIのみのエンコーディング:
        $ fn = mb_convert_encoding($ file_name、 "US-ASCII"、 "UTF-8");
        $ fn =(文字列)str_replace( "\\"、 "\\\\"、$ fn);
        $ fn =(文字列)str_replace( "\" "、" \\\ ""、$ fn);
        header( "Content-Disposition:attachment; filename = \" $ fn \ "");
    }

    readfile($ file_path);

これがお役に立てば幸いです。

于 2012-04-30T15:11:52.383 に答える
0

問題は[スクリプトとファイルシステムの間の]エンコーディングにあると思います。

基になるファイルシステムで使用しているエンコーディングを確認します。これは、ファイルにアクセスする方法です(つまり、ファイルシステムがiso-8859-1 [または同様の]を使用していて、変数をUTF-8として送信している場合-問題です。

または、getから取得している変数に対してurldecodeを実行するのと同じくらい簡単な場合もあります(ファイルシステムのエンコーディングに到達するには、この後にさらにエンコードする必要がある場合もあります)。

$filename = urldecode($_GET['file']);
于 2012-04-27T07:20:59.850 に答える