【问题标题】:Php saves uploaded files with wrong encoding on linux serverphp在linux服务器上保存上传的文件编码错误
【发布时间】:2016-05-21 20:59:25
【问题描述】:

我有一个用于保存 tmp 文件的经典 php 脚本:

$uploads_dir = "scans";
var_dump( $_FILES );
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];

        rename($tmp_name, urldecode("/var/www/html/$uploads_dir/$name") );
    }
}
echo urldecode("/var/www/html/$uploads_dir/$name");

但是,文件“фавикон.png”被保存为“фавикон.png”。请帮我解决编码问题。

谢谢

编辑:

让它与iconv 函数一起工作。然而,由于某种奇怪的原因,它不得不被编码成 windows 格式。

生成的代码:

if ($error == UPLOAD_ERR_OK) {
    $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
    $name = $_FILES["pictures"]["name"][$key];
    $name =iconv('UTF-8','windows-1251',  $name);
    copy($tmp_name, "/var/www/html/$uploads_dir/$name");
}

【问题讨论】:

  • 您的意思是临时名称的结果与您上传的名称不同吗?这是预期的行为,也是一件好事。最好不要使用用户给您的名称将文件存储在磁盘上,因为它们可能没有好处。将其移出临时目录后,单独询问名称并将其存储在数据库中,并引用该文件。 (假设这就是你的意思)

标签: php linux forms encoding upload


【解决方案1】:

您可能需要以下setlocale(LC_ALL, 'ru_RU.utf8')

【讨论】:

    【解决方案2】:

    尝试将此行放在脚本的顶部:

    header('Content-Type: text/html; charset=utf-8');
    

    【讨论】:

    • 虽然只有代码的答案可以解决操作的问题,但不建议这样做,因为它对未来的访问者没有任何价值,仅提供的答案很快就会被标记为“质量非常低"因此它会很快被删除。 edit 你的答案包括对所提供代码的作用的解释。
    【解决方案3】:

    你有没有尝试使用utf8_decode:

    utf8_decode($name);
    

    我建议您更改文件名,这样做有很好的理由。查看此帖子了解更多详情:https://stackoverflow.com/a/17866898/1016425

    【讨论】:

    • 我刚试过。没用。我正在尝试做一件事,用户可以稍后查看文件,所以如果文件被重命名,用户将很难搜索文件。
    • 我建议您仍然重命名文件并将新文件名和路径与原始文件名之间的映射保存在某处。
    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多