Uploadify PHP上传脚本似乎用连字符删除字符串部分


Uploadify PHP upload script seems to drop string portions with hyphen

几天来我遇到了一个让我挠头的问题。我使用jQuery上传上传文件到web服务器。我使用稍微修改过的uploadify.php脚本来处理文件上传:

if (!empty($_FILES)) {
    $tempFile = $_FILES['Filedata']['tmp_name'];
    $targetPath = $_SERVER['DOCUMENT_ROOT'] . "/file-repository/" . $_REQUEST['folder'] . '/';
    $targetFilename = str_replace(" ","-",$_FILES['Filedata']['name']);
    $targetFilename = preg_replace('/[^a-zA-Z0-9-_.]/', '', $targetFilename);
    $targetFile =  str_replace('//','/',$targetPath) . $targetFilename;
    move_uploaded_file($tempFile,$targetFile);
    echo str_replace($_SERVER['DOCUMENT_ROOT'],'',$targetFile);
}
?>

这个脚本直到昨天还工作得很好。现在它抛出以下错误:

:警告函数(/home/服务器/public_html/devhealth-safety/政府/团体/image.jpg)[function.move-uploaded-file]:打开流失败:没有这样的文件或目录/home/tdserver/public_html/sb3/lib/js/uploadify/uploadify.php 46行

警告:函数()[function.move-uploaded-file]:无法移动''/tmp/phpYH8nfH''到' '/home/服务器/public_html/devhealth-safety/政府/团体/image.jpg ' '在/home/服务器/public_html/dev/lib/js/uploadify/uploadify.php 在线46

由于某些原因,uploadify.php中的. "/file-repository/" .部分被删除,这意味着脚本试图将文件移动到服务器上的伪造路径。

现在,正如我所说,脚本已经工作,我没有修改它。我已经摆弄了文件夹结构,但文件路径是正确的,file-repository文件夹具有所有读/写/执行权限,属于PHP所有者和所有者组(在这种情况下是nobody:nobody)。所以我不认为我对文件夹的修补与这个问题有任何关系(但谁知道呢?)

奇怪的是,如果我用. "/filerepository/" .替换. "/file-repository/" .,脚本会抛出我所期望的错误:

:警告函数(/home/服务器/public_html/dev/filerepository/健康安全/政府/团体/image.jpg)[function.move-uploaded-file]:打开流失败:没有这样的文件或目录/home/tdserver/public_html/sb3/lib/js/uploadify/uploadify.php

所以问题是……为什么PHP会删除包含连字符的字符串部分?什么好主意吗?

在正则表达式中,连字符应该放在最后!!

'/[^a-zA-Z0-9-_.]/' should be '/[^a-zA-Z0-9_.-]/'