move_uploaded_file将文件放在目标目录之外

时间:2012-08-01 01:30:29

标签: php mysql file-upload directory

我目前有以下内容:

    if (in_array($_FILES['userfile']['type'], $mimeTypes))
      {

$target_path = "./uploads/{$_SESSION['email']}";

$target_path = $target_path . basename( $_FILES['userfile']['name']);

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $target_path)) {
    echo "The file ".  basename( $_FILES['userfile']['name']).
    " has been uploaded";

} else{
    echo "There was an error uploading the file, please try again!";
}

当有人创建登录时,会使用他们的电子邮件0666权限为用户创建目录。

目前,move_uploaded_file()将文件放在uploads目录中的用户目录的oustide。错误被抛出。我多次检查过我的相对路径是否正确。

我正在使用Ubuntu并且上传的文件上有一个Lock符号,但是我可以拖放到用户的文件夹中。

2 个答案:

答案 0 :(得分:2)

由于$target_path的输出不会包含/,因此basename()似乎缺少用户目录后的/

// Append trailing slash
$target_path = "./uploads/{$_SESSION['email']}/";
$target_path = $target_path . basename( $_FILES['userfile']['name']);

目录的正确权限应为0755(您不希望它是全局可写的!),因为目录应该具有文件系统遍历的执行权限。您可以使其成为可写组(0775),并确保上载目录的组已设置为Apache Web服务器用户。最好通过在uploads /目录上设置setgid并将其组设置为apache用户来完成此操作,因此使用在其下创建的目录将继承正确的写入权限,而不是全局可写的。

答案 1 :(得分:1)

您的$target_path看起来需要/,或者加入下一行只会创建一个其电子邮件地址前置的文件。

$target_path = "./uploads/{$_SESSION['email']}/";

$target_path = $target_path . basename( $_FILES['userfile']['name']);

如果仍然将其放在uploads/目录中,请检查$_SESSION['email']是否设置正确。