2

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

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

警告:move_uploaded_file([path\to\temp\directory] ​​\php256.tmp):无法打开流: [path/to/script/file.php][line]中没有此类文件或目录

警告: move_uploaded_file ():无法在 [ path /to/script/ 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。那时没有任何错误的迹象,只有当我尝试移动临时文件时。

您可以就这个问题提供的任何帮助将不胜感激!

4

1 回答 1

0

Geht ned mit js ... 链接:

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.
于 2015-02-12T16:33:54.987 回答