Javascript 使用formdata时,如何在XMLHttpRequest中添加头数据?

Javascript 使用formdata时,如何在XMLHttpRequest中添加头数据?,javascript,http-headers,xmlhttprequest,form-data,mediafire,Javascript,Http Headers,Xmlhttprequest,Form Data,Mediafire,我正在尝试实现一个文件上载API,如下所示: 我能够成功上传Post数据和Get数据,但不知道如何发送x-filename属性,该属性是API指南中给出的标题数据 我的代码: xmlhttp=new XMLHttpRequest(); var formData = new FormData(); formData.append("Filedata", document.getElementById("myFile").files[0]); var photoId = getCookie(

我正在尝试实现一个文件上载API,如下所示:

我能够成功上传Post数据和Get数据,但不知道如何发送x-filename属性,该属性是API指南中给出的标题数据

我的代码:

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);

用法:
xmlhttp.setRequestHeader(键,值)

您的错误

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

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


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

在Chrome的中,可以找到类似于:
F12:Developer Tools>Network Tab>您发送的任何请求>“查看源代码”的响应标题下的内容

根据您的测试工作流程,如果您添加的任何一对都不存在,您可能只需要清除浏览器缓存。要验证您的浏览器是否使用了最新的代码,您可以在Chrome中查看页面的源代码,例如:
F12:Developer Tools>Sources选项卡>YourJavascriptSrc.js
并检查代码

但正如其他答案所说:

xhttp.setRequestHeader(key, value);

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

之前。我也尝试过,javascript在该语句之后停止执行,不起作用!(将此添加到我的问题中)您能给我们提供
setRequestHeader
的错误文本吗?它是javascirpt,因此没有错误文本,脚本只是停止执行,可能只是不允许澄清,您的意思是您的?@apsillers ohh,I never new abt Error:Uncaught InvalidStateError:试图使用不可用或不再可用的对象。upload.php:42 uploadAjax upload.php:42 onclick upload.php:130@apsillers第42行是setrequestheader行&第130行有一个带有onclick属性的按钮,该按钮调用上述代码。该代码消除了错误,但仍然不起作用。。由于同源策略,实际上无法从mediafire获得响应。不知道问题出在哪里,请您检查一下&让我知道问题出在哪里,文件在没有此编辑的情况下已成功上载到mediafire,现在没有任何内容上载!没有该行文件正在上载,但使用默认名称!这就把事情弄清楚了一点。看见同源策略允许“简单”请求到达客户端,然后决定客户端是否可以读取结果。在发送实际请求之前,使用“飞行前”请求验证“非简单”请求。添加一个非简单头将请求从简单更改为非简单。在这两种情况下,我假设您无法从服务器读取响应?或者为了解决问题,我可以在将上传的文件发送到mediafire之前更改其名称吗??那么我就不需要发送额外的参数了。哦,很高兴知道添加头会使请求变得不简单。谢谢你的帮助:)
xhttp.setRequestHeader(key, value);