上传问题(权限被拒绝)

时间:2010-06-29 14:37:35

标签: php file upload

我目前正在使用vork框架中的文件组件上传文件,但我一直收到此错误:

警告:move_uploaded_file(/ uploads)[function.move-uploaded-file]:无法打开流:第105行/ var / www / rto-vork / mvc / components / file中的权限被拒绝

警告:move_uploaded_file()[function.move-uploaded-file]:无法在第105行的/ var / www / rto-vork / mvc / components / file中将'/ tmp / php3WC6QP'移动到'/ uploads' string(32)“无法移动上传的文件”成功

我相信组件本身很好,而且uploads目录已经被编译为777

这是上传的代码 正确传递文件ID

public function uploadFile($id, $destination, $imagesOnly = false) {

    $return = false;

    if (substr($_FILES[$id]['name'], 0, 1) == '.') {

        $return = 'File names must not begin with a dot';

    } else {

        $isInvalidUpload = $this->isInvalidUpload($id, $imagesOnly);

        if ($isInvalidUpload) {

            $return = $isInvalidUpload;

        } else {

            if (move_uploaded_file($_FILES[$id]['tmp_name'], $destination)) {

                if (is_dir($destination)) {

                    if ($destination[-1] != '/' && $destination[-1] != '\\') {

                        $destination .= '/';

                    }

                    $destination .= $_FILES[$id]['tmp_name'];

                }

                chmod($destination, 0777);

            } else {

                $return = 'Could not move the uploaded file';

            }

        }

    }

    return $return;

}

3 个答案:

答案 0 :(得分:2)

你的代码存在缺陷:

public function uploadFile($id, $destination, $imagesOnly = false) {
   ...
   if (move_uploaded_file(...)) {
       if (is_dir(...)) {
           ...
       }
    } else {
       $return = 'Could not move the uploaded file';
    }
}

您使用uploadFile('somename', '/uploads')调用方法,因此代码首先尝试将上传的文件直接移动到/uploads,但这是一个目录。 move_uploaded_file()不像常规文件系统'move'命令,源和目标都必须是文件名。因此,您的初始移动尝试失败,它返回false,并且事情直接跳转到“无法移动文件”返回调用。它甚至从未尝试将$ destination作为目录来处理

您应该按如下方式重构方法:

public function uploadFile(...) {
    ...
    // if $destination is a directory, handle that fact
    if (is_dir($destination)) {
       $destination .= '/' . $new_file_name;
    }
    // THEN try to move the file
    if (move_uploaded_file($source, $destination)) {
       return('worked');
    } else {
       return('failed');
    }
}

另外,请注意虽然不太可能,但PHP指定的临时文件名 NOT 保证随着时间的推移是唯一的。完全可能的是,在某些时候,线路会再次生成相同的随机名称,并且您将覆盖较旧的上传。您应该使用保证唯一的文件名,例如数据库中的主键“id”字段或其他非重复数据源。

答案 1 :(得分:0)

在我看来,您试图移动目录本身,或者您正在尝试编写目录而不是文件。

Warning: move_uploaded_file**(/uploads)** [function.move-uploaded-file]: failed to open stream: Permission denied in /var/www/rto-vork/mvc/components/file on line 105

确认您使用的是生成的临时文件名,并且您正在指定文件名以将文件另存为。

答案 2 :(得分:0)

错误信息非常明确:您无法写入目录/uploads 难怪 - 在unix系统上没有人让你写入系统root :) 这是你的问题 - 你弄乱了一个web根和一个文件系统根。
一般来说,如果其余代码没问题,这段代码应该会有所帮助:

$destination = $_SERVER['DOCUMENT_ROOT'].$destination;

但我怀疑其余代码是否正常 比方说,$destination .= $_FILES[$id]['tmp_name'];是非常无意义的代码 我认为你最好找到另一个组件或编写自己的组件