使用XMLHttprequest上传文件 - 在multipart/form-data中缺少边界

Tam*_*Pap 8 javascript php xmlhttprequest xmlhttprequest-level2

我正在使用XMLHttprequest上传文件.这是JS函数,它上传文件:

var upload = function(file) {
    // Create form data
    var formData = new FormData();
    formData.append('file', file);

    var xhr = new XMLHttpRequest();

    // Open
    xhr.open('POST', this.options.action);

    // Set headers
    xhr.setRequestHeader("Cache-Control", "no-cache");
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xhr.setRequestHeader("Content-Type", "multipart/form-data");
    xhr.setRequestHeader("X-File-Name", file.fileName);
    xhr.setRequestHeader("X-File-Size", file.fileSize);
    xhr.setRequestHeader("X-File-Type", file.type);

    // Send
    xhr.send(formData);
}
Run Code Online (Sandbox Code Playgroud)

在服务器端,在upload.php中我以这种方式读取文件:

file_put_contents($filename, (file_get_contents('php://input')));
Run Code Online (Sandbox Code Playgroud)

一切正常,除了我得到一个PHP警告:

Missing boundary in multipart/form-data POST data in Unknown on line 0.

如果我删除此行: xhr.setRequestHeader("Content-Type", "multipart/form-data");警告消失.

这应该是什么问题?

Tam*_*Pap 12

嗯这对我来说有点奇怪,但这是有效的:

// Open
xhr.open('POST', this.options.action, true);

// !!! REMOVED ALL HEADERS

// Send
xhr.send(formData);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在服务器端,我不读取通过发送的文件,php://input但文件将在$_FILES数组中.

这解决了我的问题,但我仍然好奇为什么现在出现该文件$_FILES

在Chrome,Mozilla,Safari和IE10中测试过.

  • [规范](http://www.w3.org/TR/XMLHttpRequest/#the-send-method)解释(第3点)浏览器设置正确的标题(包括Content-Type中正确的多部分边界指示) )如果你没有手动指定任何东西.该文件出现在`$ _FILES`中,因为PHP [自动将多部分表单上传的文件放入该超级全局](http://www.php.net/manual/en/features.file-upload.post-method.php). (8认同)