我目前正在使用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;
}
答案 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'];
是非常无意义的代码
我认为你最好找到另一个组件或编写自己的组件