Php 上载带有特殊字符的文件时出现问题

Php 上载带有特殊字符的文件时出现问题,php,file-upload,Php,File Upload,我编写了一个小的上传脚本,在我使用它时,它在任何情况下都能正常工作,但我总是从我的客户那里收到消息,他收到一个错误,当上传出错/不起作用时,我就死了() 我相信这是由他们使用的特殊字符造成的。因为他们是奥地利人,所以在他们的文件名中有像ÄÄöÜÜß这样的特殊字符。另外,它们在文件名中使用空格。 因此,我使用正则表达式将特殊字符替换为下划线(\ux) 如果错误不是由文件名中的特殊字符引起的,我不确定问题出在哪里。在这种情况下,函数返回FALSE: 如果文件名不是有效的上载文件,则不会执行任何操作

我编写了一个小的上传脚本,在我使用它时,它在任何情况下都能正常工作,但我总是从我的客户那里收到消息,他收到一个错误,当上传出错/不起作用时,我就死了()

我相信这是由他们使用的特殊字符造成的。因为他们是奥地利人,所以在他们的文件名中有像ÄÄöÜÜß这样的特殊字符。另外,它们在文件名中使用空格。 因此,我使用正则表达式将特殊字符替换为下划线(\ux)


如果错误不是由文件名中的特殊字符引起的,我不确定问题出在哪里。

在这种情况下,函数返回FALSE:

  • 如果文件名不是有效的上载文件,则不会执行任何操作,并且 move\u上传的\u file()将返回FALSE

  • 如果文件名是有效的上载文件,但某些文件无法移动 原因是,不会发生任何操作,并且将返回move\u上传的\u file() 错。此外,将发出警告

  • 您正在使用此regex
    /[^a-zA-Z0-9\.]/s
    筛选文件名,但这只会替换第一次出现的特殊字符,而不是全部。 尝试添加“g”修饰符:
    /[^a-zA-Z0-9\]/sg

  • 您确定您的客户端具有移动文件的正确权限吗 到理想的位置?我会再检查一遍


  • 我试过这个你的意思是
    move\u uploaded\u file()
    返回
    false
    ?在这种情况下,手册说它应该抛出一个警告。正则表达式工作正常。如果我上传一个名为“Dasöist groß.pdf”的文件,它会将其重命名为“Das_uuuuuuuuist_ugroß.pdf”。它不能是权限,因为这是一个Web表单,脚本由apache/www数据处理,并且由于我可以上传,他们应该能够上传到。但是已经谢谢了:)嗯。。。您能否检查
    $\u文件['yourfile']['error']==0
    ?如果是0,则上载进行得很顺利,但移动文件时出现问题,否则就是上载问题。如果失败,函数将给出一个错误,解释原因。。。添加
    错误报告(E\u ALL)在文件顶部。我尝试了这个,但没有得到任何错误。我不能让我的客户每10分钟测试一次脚本。。。sry
    
    $moveFile = function($tmpname,$name,$time) {
                        // the regex to resolve the special chars problem
                $name = preg_replace('/[^a-zA-Z0-9\.]/s', '_', $name);
                if (!move_uploaded_file($tmpname,'assets/siteContents/bewerbungen/'.$time.'_'.$name)) {
                    die('something went wrong while uploading');
                }
            };
    
            // move application_files__image
            $moveFile($_FILES['application_files__image']['tmp_name'],
                $_FILES['application_files__image']['name'],
                $time);
            // move application_files__image
            $moveFile($_FILES['application_files__cv']['tmp_name'],
                $_FILES['application_files__cv']['name'],
                $time);
            // move application_files__certificates
            if (count($_FILES['application_files__certificates']['name'])) {
                foreach ($_FILES['application_files__certificates']['name'] as $i => $name) {
                    $moveFile($_FILES['application_files__certificates']['tmp_name'][$i],
                        $_FILES['application_files__certificates']['name'][$i],
                        $time);
                    $a_list[] = 'assets/siteContents/bewerbungen/'.$time.'_'.preg_replace('/[^a-zA-Z0-9\.]/s', '_',$_FILES['application_files__certificates']['name'][$i]);
                }
            }