从文件上传通过PHP丢失PHP中的临时文件。 AJAX

时间:2013-08-27 16:14:05

标签: php javascript jquery ajax

我一直在寻找通过上传文件。 AJAX使用FormData和FileReader,但我一直遇到同样的问题。

触发文件上传后,会将其传递给PHP脚本,该脚本验证上传的文件并尝试将其移动到永久目录中。不幸的是,虽然验证成功,但调用move_uploaded_file()会产生以下警告:

  

警告:move_uploaded_file( [path \ to \ temp \ directory] ​​ \ php256.tmp):失败   打开流:没有这样的文件或目录   的 [路径/到/脚本/ file.php]   在线 [line]

     

警告:move_uploaded_file():   无法移动' [path \ to \ temp \ directory] ​​ \ php256.tmp'至   ' [路径\到\永久\目录] \ [FILENAME.EXT] '   在   的 [路径/到/脚本/ file.php]   在线 [line]

通过正常提交表单上传文件并移动临时文件按预期工作。

我的php.ini设置非常标准:

file_uploads = On
upload_tmp_dir = "[path\to\temp\directory]"
upload_max_filesize = 2M
max_file_uploads = 20

我的PHP也应该是非常标准的:

$fileField = 'target_file';

if(!(isset($_FILES) && is_array($_FILES) && isset($_FILES[$fileField]))) {
    // No File Sent (Error Out)
}

$file = $_FILES[$fileField];

// Errors in transfer?
if(isset($file['error'])) {

    $haltMessage = false;

    switch($file['error']) {
        /* Switchboard checking through all standard file upload errors. And, of course, ERR_OK */
    }

    if($haltMessage !== false) {

        // An error occured! Error Out

    }

}

// Check if the file was uploaded.
if(!is_uploaded_file($file['tmp_name'])) {

    // No File Uploaded (Error Out)

}

if(/* File type checking.. */)) {

    // Invalid file type (Error Out)

}

$uploadDir = 'path/to/permanent/dir';

$fileName = $file['name'];

$location = $uploadDir . DS . basename($fileName); // DS = '/'

$result = move_uploaded_file($file['tmp_name'], $location);

if($result) {

    // Yes!

} else {

    // Something did indeed go wrong.
    // This block of code is ran after the warnings are issued.


}

这样就让我的JavaScript变得有些需要了:

(function($) {


    $(document).ready(function(){

        var url = 'url/to/php/script.php',
            input,
            formdata;

        // FormData support? (We have a fallback if not)
        if(window.FormData != null && window.FileReader != null) {

            input = document.getElementById('target_file');
            formdata = new FormData(),

            input.addEventListener('change', function(ev) {

                var reader,
                    file;

                if(this.files.length === 1) {

                    file = this.files[0];

                    if(!!file.type.match(/* File type matching */)) {

                        reader = new FileReader();
                        reader.onloadend = function (e) {

                            // Uploaded Handle

                        }

                        reader.onload = function() {

                            formdata.append('target_file', file);

                            $.ajax({
                                url : url,
                                type : "POST",
                                data : formdata,
                                processData: false,
                                contentType: false,
                                success : function(res) {
                                    console.log(res);
                                }
                            });

                        }

                        reader.readAsDataURL(file);

                    } else {
                        // Invalid file type.
                    }

                } else {
                    // No file / too many files (hack) selected.
                }

            }, false);

        }
    });
}(jQuery));

我使用FireFox 23.0.1,并且我在服务器上运行PHP 5.4.7。

为长期问题道歉,但我不确定问题出在哪里。转储$ _FILES变量会显示一个数组,其中包含预期的文件信息,包括tmp_name。只有在我尝试移动临时文件时,此时才会出现任何错误迹象。

非常感谢您对此问题提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

Geht ned mit js ...     Link:

move_uploaded_file() ist von den normalen Safe Mode UID-Einschränkungen nicht betroffen. Dies ist nicht unsicher, da move_uploaded_file() nur mit via **PHP hochgeladenen Dateien** arbeitet.