60

我正在尝试实现文件上传 API,此处给出:
Mediafire 文件上传

我能够成功上传Post data & Get data,但不知道如何发送x-filename属性,这意味着API 指南中给出的Header 数据。

我的代码:

xmlhttp=new XMLHttpRequest();
var formData = new FormData();

formData.append("Filedata", document.getElementById("myFile").files[0]);

var photoId = getCookie("user");
// formData.append("x-filename", photoId);            //tried this but doesn't work
// xmlhttp.setRequestHeader("x-filename", photoId);   //tried this too (gives error) [edited after diodeous' answer]

xmlhttp.onreadystatechange=function()
{
    alert("xhr status : "+xmlhttp.readyState);
}

var url = "http://www.mediafire.com/api/upload/upload.php?"+"session_token="+getCookie("mSession")+"&action_on_duplicate=keep";

xmlhttp.open("POST", url);
// xmlhttp.setRequestHeader("x-filename", photoId);   //tried this too, doesnt work. Infact nothing gets uploaded on mediafire.  [edited after apsillers' answer]
// cant get response due to same origin policy
xmlhttp.send(formData);
4

3 回答 3

107

你的错误

InvalidStateError:尝试使用不可用或不再可用的对象

出现是因为您必须在调用setRequestHeader 调用open。只需将您的行移到您的setRequestHeader行下方open(但在 之前send):

xmlhttp.open("POST", url);
xmlhttp.setRequestHeader("x-filename", photoId);
xmlhttp.send(formData);
于 2013-10-29T15:15:03.990 回答
37

采用:xmlhttp.setRequestHeader(key, value);

于 2013-10-29T14:40:05.957 回答
1

检查键值对是否实际显示在请求中:

Chrome中,找到类似的地方:F12: Developer Tools > Network Tab > Whatever request you have sent > "view source" under Response Headers

根据您的测试工作流程,如果您添加的任何对不存在,您可能只需要清除浏览器缓存。要验证您的浏览器是否使用最新的代码,您可以检查页面的来源,在Chrome中可以找到类似的位置: F12: Developer Tools > Sources Tab > YourJavascriptSrc.js并检查您的代码。

但正如其他答案所说:

xhttp.setRequestHeader(key, value);

应该在您的请求标头中添加一个键值对,只需确保将其放在您的之后open()和您之前send()

于 2018-01-16T23:13:26.547 回答