2

だから、私はmove_uploaded_file()の問題についてのこの質問を読みました。しかし、私のapacheを利用したローカルホストランプスタックでは、問題なく動作しています。だから私はそれがファイルシステム/パスのものであり、コードのものではないと思います。

私のサイトにローカルでファイルをアップロードするとき、それは機能します。

しかし、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 );

4

2 に答える 2

5

フォルダには、特に権限に問題がありました。

そのパスの/filesディレクトリは実際には存在しません。どういうわけか、フォルダが単にそこにないことに気づきませんでした。おっと。

次に、phpを実行するためにnginxが使用したユーザーを特定する必要がありました。

ps aux | grep "nginx"

それから私はディレクトリに行かなければなりませんでしchownfiles

chown -R root:userFromStep1 files

それから私はchmodディレクトリに行かなければなりませんでした:

chmod g+w files

それは魅力のように機能しました。

于 2012-09-08T17:25:07.107 に答える
0

を使用する代わりに、正確なパスを指定してみてください__FILES__。nginxの問題にはならないからです。パスの問題のみになります

于 2012-09-08T16:24:28.450 に答える