【问题标题】:PHP file upload -> replace special chars didn't workPHP文件上传->替换特殊字符不起作用
【发布时间】:2013-09-16 22:33:09
【问题描述】:

我现在正在寻找两个小时的解决方案,但我在网上找到的没有任何帮助...

我有一个带有上传表单的网络服务,它们都可以正常工作。我更喜欢 JS,我的整个服务都是用 HTML5、CSS3 和 JS 构建的……但我的上传表单是 PHP。我在网上找到了一个脚本,它有效,所以我很好。现在我意识到,当我想上传带有 ä、ö、ü 和 ß 等字符的文件时,我的服务存在问题。不幸的是,在德国,这些是我们语言中的常见字符,所以我必须用其他字符替换它们。

我到处看看,现在我的代码看起来像这样:

$files = $_FILES['fileselect'];

foreach ($files['error'] as $id => $err) {
    if ($err == UPLOAD_ERR_OK) {

        $fn = $files['name'][$id];

        $search_array  = array ('ä', 'ö', 'ü', 'ß');
        $replace_array = array ('ae', 'oe', 'ue', 'ss');

        $gfn = str_replace($search_array, $replace_array, $fn);

        move_uploaded_file(
            $files['tmp_name'][$id],
            'bildtransfer/' . $gfn
        );

        echo "<p>Die Datei $gfn wurde hochgeladen.</p>";
    }
}

上传本身仍然适用于文件,只要它们没有那些特殊字符。我的文件仍然有所有特殊字符,似乎没有任何替换?

我需要 preg_replace 而不是 str_replace 吗?我试过了,还是不行……

我希望你能帮助我吗?会很高兴!!! :)

【问题讨论】:

  • 是否有特殊原因要替换文件名中的字符?
  • 我建议你在门口停下来,只允许标准字符 [^a-zA-z0-9] 使用 if 条件。
  • 您可以使用的另一种方法是使用公共起始词重命名所有传入文件,然后使用服务器的时间戳为其设置唯一编号和/或rand()。问题解决了,您不必担心非标准字符。即:incoming_file_2013_12_09_98372728883011093.xxx
  • George:上传文件后,我将它们放入 SQL 数据库并使用 AJAX 在页面上列出它们......所以当我的文件名中有 äüö 或 ß 之类的字符时,它会引发错误 :( Fred:这将是一个可能的解决方案,但将它重命名会很棒......:S 无论如何,感谢您的回答!:) 编辑:感谢下一个解决方案,Fred! ;) 我会考虑的! :)
  • @Fabi 不客气。这就是我自己使用的,但我的文件没有插入数据库,只是一个简单的上传文件驻留在服务器上。干杯(编辑:您可以引用该文件并在 move_uploaded_file 函数之前为其分配一个变量,以便显示用户计算机中选择的文件名)可以工作,非常有信心它会。

标签: php file-upload preg-replace str-replace


【解决方案1】:

您似乎错误地使用了 $_FILES 数组。任何错误都将存储在$_FILES['fileselect']['error'] - 不需要foreach 语句。

文件的原始名称存储在$_FILES['fileselect']['name'],因此请尝试在str_replace() 调用中使用它:

$file = $_FILES['fileselect'];
if($file['error'] == UPLOAD_ERR_OK) {
    $fn = $file['name'];

    $search_array  = array ('ä', 'ö', 'ü', 'ß');
    $replace_array = array ('ae', 'oe', 'ue', 'ss');

    $gfn = str_replace($search_array, $replace_array, $fn);

    move_uploaded_file(
        $file['tmp_name'],
        'bildtransfer/' . $gfn
    );

    echo "<p>Die Datei $gfn wurde hochgeladen.</p>";
}

说实话,我现在不确定它为什么会起作用!阅读Handling file uploads 上的 PHP 文档。

要解决此问题,以便您不必费心替换字符,请尝试在发送字符时告诉浏览器您使用的是 UTF-8,正如@aaron 所建议的那样:

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

【讨论】:

  • 虽然它确实有意义,但实际文件名本身可能存在问题。谁知道 OP 的服务器会对非标准字符做出什么反应。
  • 我假设像普通服务器一样 - 它不会让人眼前一亮。它们当然是有效的文件名字符。
  • 我会回避使用非标准字符。我是那种“谨慎行事”的人;-)
  • 让我感兴趣的是它安全的,以至于它表明如果它不起作用,那就是非常错误的......:/
【解决方案2】:

这可能是编码问题。尝试在标头中将编码类型更改为 UTF-8。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2019-09-23
    相关资源
    最近更新 更多