XMLHttpRequest - 发送文件?

时间:2013-09-18 11:32:19

标签: javascript php ajax

在我的表格提交中,我有:

var formData = new FormData();

        for (var i = 0; i < ctx.files.length; i++) {
            formData.append('file[]', ctx.files[i]);

        }

在我的服务器端,我只是转储$ _POST。

我明白了:

array(1) {
 ["file"]=>
  array(1) {
    [0]=>
   string(17) "[object FileList]"
 }
}

它是以字符串形式出现的,我怎样才能将它作为一个文件数组?

以下是整个请求:

var formData = new FormData();

        for (var i = 0; i < ctx.files.length; i++) {
            formData.append('file[]', ctx.files[i]);
            //formData.push(ctx.files[i]);
        }

        // now post a new XHR request
        var xhr = new XMLHttpRequest();
        xhr.open('POST', '/site-manager-gateway/add-content');
        xhr.onload = function () {
            if (xhr.status === 200) {
                console.log('all done: ' + xhr.status);
            } else {
                console.log('Something went terribly wrong...');
            }
        };

        xhr.send(formData);

1 个答案:

答案 0 :(得分:0)

遗失的东西

发送前添加:
xhr.setRequestHeader("Content-Type","multipart/form-data");

访问文件

之后,可以像这样访问文件:

$count = count($_FILES['file']['name']);
for($i=0; $i<$count; $i++)
{
   echo 'Uploaded File With FileName: '.$_FILES['file']['name'][$i].'<br/>';

}

更多信息:$ _FILES变量

http://www.php.net/manual/en/reserved.variables.files.php

如果您转到此链接,您会看到$_FILES变量将如下所示:

array(1) {
    ["upload"]=>array(5) {
        ["name"]=>array(3) {
            [0]=>string(9)"file0.txt"
            [1]=>string(9)"file1.txt"
            [2]=>string(9)"file2.txt"
        }
        ["type"]=>array(3) {
            [0]=>string(10)"text/plain"
            [1]=>string(10)"text/plain"
            [2]=>string(10)"text/plain"
        }
        ["tmp_name"]=>array(3) {
            [0]=>string(14)"/tmp/blablabla"
            [1]=>string(14)"/tmp/phpyzZxta"
            [2]=>string(14)"/tmp/phpn3nopO"
        }
        ["error"]=>array(3) {
            [0]=>int(0)
            [1]=>int(0)
            [2]=>int(0)
        }
        ["size"]=>array(3) {
            [0]=>int(0)
            [1]=>int(0)
            [2]=>int(0)
        }
    }
}

“但......我的文件在哪里?”

您的文件位于临时文件夹中(在linux中,默认为/ tmp) 从这个临时文件夹恢复文件的唯一方法是在每个文件上使用php函数:

move_uploaded_file

根据php documentation

  

“此函数检查以确保文件名指定的文件   是一个有效的上传文件(意味着它是通过PHP的HTTP上传的   POST上传机制)。如果文件有效,它将被移动到   目的地给出的文件名。

     

如果有任何机会,这种检查尤其重要   任何完成上传文件的内容都可以将其内容透露给   用户,甚至是同一系统上的其他用户。“

move_uploaded_file用法

这是你应该怎么做的。如果你上传的目录叫做“上传”,那么:

<?php
$uploads_dir = '/uploads';
foreach ($_FILES["file"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["file"]["tmp_name"][$key];
        $name = $_FILES["file"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}
?>

这会将所有文件保存在“/ uploads”目录中。