我目前有以下内容:
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符号,但是我可以拖放到用户的文件夹中。
答案 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']
是否设置正确。