所以,我已经阅读了有关move_uploaded_file()问题的this question。但是,在我的apache-powered localhost灯堆上,它的工作正常。所以我认为它可能是一个文件系统/路径的东西,而不是代码的东西。
在本地将文件上传到我的网站时,它可以正常工作。
但是当我在QA服务器上(由nginx驱动)时,我收到此错误:
2012/09/08 15:34:21 [error] 11794#0: *5187 FastCGI sent in stderr: "files not empty
PHP Warning: move_uploaded_file(/var/www/qa.mysite.com/mysite/app/files/maps-aprilfools.tiff): failed to open stream: No such file or directory in /var/www/qa.mysite.com/mysite/app/models/files.php on line 516
PHP Warning: move_uploaded_file(): Unable to move '/tmp/phpvdtznP' to '/var/www/qa.mysite.com/mysite/app/files/maps-aprilfools.tiff' in /var/www/qa.mysite.com/mysite/app/models/files.php on line 516" while reading response header from upstream, client: 72.xxx.xxx.xxx, server: qa.mysite.com, request: "POST /projects/3/files HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "qa.mysite.com", referrer: "http://qa.mysite.com/projects/3/files"
这是我为处理上传文件而编写的代码:
public function fileUploadToProject( $project_id ) {
if ($_FILES["upload-file"]["error"] > 0) {
echo "Error: " . $_FILES["file"]["error"] . "<br />";
} else {
$dbSuccess = false;
$tmp_name = $_FILES["upload-file"]["tmp_name"];
$name = $_FILES["upload-file"]["name"]; // someFile.ext
$size = $_FILES['upload-file']['size']; //size in bytes
$mime = $_FILES['upload-file']['type']; //size in bytes
$destination = __FILES__.'/'.$name;
$uploaded = move_uploaded_file( $tmp_name, $destination );
// add entry to database.
/*
* null because there is no container yet.
* We're only uploading to local
*/
$user_container_name = null;
$uploaded_by = LoggedInUser::get_user_id();
/*
* Set this 1 when we're not dealing with our external fileserver
*/
$isLocal = 1;
/*
* Probably shouldn't do this forever for storage size reasons, but for now its useful.
*/
$localPath = $destination;
$task_id = null;
if( $uploaded ) {
$dbSuccess = $this->insertFileRefService( $task_id,
$project_id,
$user_container_name,
$name,
$mime,
$size,
$uploaded_by,
$isLocal,
$localPath
);
if($dbSuccess) {
return true;
} else {
// should I rollback / delete that file?
return false;
}
} else {
return false;
}
}
}
那么,关于在nginx上将临时文件移动到我的文件系统,有什么我应该知道的吗?或者你认为这只是一个路径问题?代码问题?
此外,请注意第516行是:$uploaded = move_uploaded_file( $tmp_name, $destination );
答案 0 :(得分:5)
该文件夹在权限方面存在问题。
该路径中的/files
目录实际上不存在。我莫名其妙地从未意识到文件夹根本就不存在。糟糕。
然后,我必须确定nginx使用什么用户来执行php:
ps aux | grep "nginx"
然后我必须chown
files
目录:
chown -R root:userFromStep1 files
然后我必须chmod
目录:
chmod g+w files
就像魅力一样。
答案 1 :(得分:0)
请尝试提供确切路径,而不是使用__FILES__
。因为它不会是nginx问题。它只会是路径问题