几天来我遇到了一个让我挠头的问题。我使用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_.-]/'