当前位置: 首页 > 知识库问答 >
问题:

php编码-如果我的文件使用希腊字符保存,则无法下载

濮阳振海
2023-03-14

我正在创建一些下载链接。我的问题是,如果“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;
        }
    }
?>

共有1个答案

穆英飙
2023-03-14

您的脚本中可能存在以下几个问题:

1。文件系统编码问题

要实际访问文件系统上的文件,必须正确编码文件名。LC_CTYPE区域设置参数告诉磁盘上文件名的预期编码。

根据我的经验,不同的浏览器支持不同的方法来编码非ASCII文件名,并且在出现特殊字符或无效字符时表现不同(例如,在Windows下,文件名中不允许问号“?”,浏览器要么简单地删除该字符,要么用随机生成的另一个字符完全替换整个文件名)。无论如何,以下代码块可以在大多数浏览器中使用:


    $file_name = "Caffé Brillì.pdf";   # file name, UTF-8 encoded
    $file_mime = "application/pdf";    # MIME type
    $file_path = "absolute/or/relative/path/file";

    header("Content-Type: $file_mime");
    header("Content-Length: " . filesize($file_path));
    $agent = $_SERVER["HTTP_USER_AGENT"];
    if( is_int(strpos($agent, "MSIE")) ){
        # Remove reserved chars: :\/*?"|
        $fn = preg_replace('/[:\\x5c\\/*?"|]/', '_', $file_name);
        # Non-standard URL encoding:
        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")) ) {
        # Remove reserved chars: :\/*{?
        $fn = preg_replace('/[:\\x5c\\/{?]/', '_', $file_name);
        # RFC 2231:
        header("Content-Disposition: attachment; filename*=UTF-8''"
        . rawurlencode($fn));

    } else {
        # RFC 2616 ASCII-only encoding:
        $fn = mb_convert_encoding($file_name, "US-ASCII", "UTF-8");
        $fn = (string) str_replace("\\", "\\\\", $fn);
        $fn = (string) str_replace("\"", "\\\"", $fn);
        header("Content-Disposition: attachment; filename=\"$fn\"");
    }

    readfile($file_path);

希望这能有所帮助。

 类似资料:
  • 我在R中读取包含希腊字母的csv文件时遇到问题。我试过: 这个网站(如何检测read.csv的正确编码?)建议我尝试不同的文件编码,但似乎都不管用。R显示希腊字母,如下所示: 然而,在Excel中,它就像: 有谁知道我做错了什么,或者我如何才能正确地阅读希腊字母?非常感谢。文件可以在此处下载:https://drive.google.com/file/d/1K44FTvUFUWm5l-xwz58S

  • 导入以下文件时遇到问题:http://www.kuleuven.be/bio/ento/temp/test.xlsx以正确的编码输入R。特别地, 给了我 但是

  • 我正在尝试使用iText 7为Java创建一个带有希腊字符的pdf。PDF中只有拉丁字符和数字可见。 我正在使用以下代码加载字体: 我该怎么办?

  • 我有一个带有一些特殊字符的mysql数据库,一个输入表单,一些PHP页面。 > 这个页面发送(通过GET)一个参数到另一个php页面(ResultsPage)。 最后这个php页面(ResultsPage)向dbms发送一个带有参数的查询并显示结果。 RequestPage编码为utf-8至 meta http equiv=“Content Type”Content=“text/html;char

  • 我有一个网站,每月通过FTP接收一次CSV文件。多年来,这是一个ASCII文件。现在我一个月收到UTF-8,下一个月收到UTF-16BE,下个月收到UTF-16LE。也许下个月我会得到UTF-32。fget返回UTF文件开头的字节顺序标记。如何让PHP自动识别字符编码?我尝试过mb_detect_encoding它返回ASCII不管文件类型。我更改了代码以读取BOM,并显式地将字符编码mb_con

  • 我正在创建一个包含希腊字符的XHTML。在下面找到一个简单的例子。 当我打印结果时,我得到了。 有什么能帮忙的吗?