Javascript 通过xmlHttpRequest以多部分形式发送文件

Javascript 通过xmlHttpRequest以多部分形式发送文件,javascript,ajax,servlets,file-upload,multipart,Javascript,Ajax,Servlets,File Upload,Multipart,我可以通过XMLHttpRequest将文件作为多部分发送到servlet吗?我正在制作一个表单并将其作为多部分提交,但不知何故,我没有收到成功上传表单的响应。我不希望页面被刷新,因此它必须通过ajax进行。使用xhr更新发送多部分/表单数据是不可能的:尽管在现代浏览器中,使用XHR2是可能的。见巴卢斯克的回答 实现它的一种常见方法是使用正则形式,但使用iframe。这样,只有iframe在上传时才会刷新。这只有在XHR以前被称为XHR2或XHR级别2的一部分,目前被称为XHR高级功能的情况下才

我可以通过XMLHttpRequest将文件作为多部分发送到servlet吗?我正在制作一个表单并将其作为多部分提交,但不知何故,我没有收到成功上传表单的响应。我不希望页面被刷新,因此它必须通过ajax进行。

使用xhr更新发送多部分/表单数据是不可能的:尽管在现代浏览器中,使用XHR2是可能的。见巴卢斯克的回答


实现它的一种常见方法是使用正则形式,但使用iframe。这样,只有iframe在上传时才会刷新。

这只有在XHR以前被称为XHR2或XHR级别2的一部分,目前被称为XHR高级功能的情况下才有可能

考虑到这个HTML

您可以按如下方式上传:

var formData=新formData; formData.appendmyFile,document.getElementByIdmyFileField.files[0]; var xhr=新的XMLHttpRequest; xhr.openPOST,myServletUrl; xhr.sendformData; XHR将考虑正确的头和请求体编码,在本例中,该文件将作为名为myFile的表单数据部分在服务器端可用

您需要记住,旧浏览器不支持FormData API。目前,你可以看到它已经在Chrome7+、Firefox3.5+、Safari5+、IE10+和Opera12+中实现

如果您使用的是jQuery,那么您可能会尝试使用它的$.val函数,如下所示:

formData.appendmyFile,$myFileField.val; 但这是不正确的,因为它不返回整个对象,而只返回作为字符串的文件名,这是完全无用的,因为它不包含文件内容

如果出于某种原因不想使用document.getElementById,请改用以下方法之一:

formData.appendmyFile,$myFileField.propfiles[0]; formData.appendmyFile,$myFileField[0]。文件[0]; 另一种方法是使用。当您的整个表单在没有任何JavaScript代码的情况下正确编写和运行时,将立即通过以下行进行ajaxified:

$("#formId").ajaxForm(function(response) {
    // Handle ajax response here.
});
它还通过隐藏的iframe技巧支持文件上传。请参见,以获得更深入的解释。您可能只需要更改servlet代码就可以拦截正常的同步和ajax异步请求。有关具体示例,请参见此答案:

无论哪种方式,上传的文件都应该在servlet的doPost方法中可用,如下所示:

Part myFile = request.getPart("myFile");

或者,如果您仍然使用Servlet2.5或更高版本,请使用ApacheCommonsFileUpload的常规方式。另请参见此答案以获取具体示例:

实际上,无论文件是否上载,我都希望得到响应。另外,我还需要上传图像的位置。Tejasva:看看Napolux中的示例,它指定了上传完成后如何在父窗口上调用js函数。它还可以提供图像位置。@LinusGThiel这是可能的。请参阅BalusC的答案。是的,使用XHR2是可能的。在现代浏览器中,还有FileAPI和其他很酷的功能。也许我应该试着解释一下如何做到这一点,使用旧浏览器的回退等等。老实说,我不确定我是否能以一种好的方式让提问者明白这一点。我同意BalusC的答案比我的好。另请参见:如果在我们的页面中自动生成许多输入文件,会发生什么?我们可以生成ID吗?@BalusC我想知道为什么没有关于如何生成的信息&为什么XMLHttpRequest+FormData集头会自动生成,在MDN或其他地方谷歌搜索了很多。每当我设置“内容类型”、“多部分/表单数据”时,我的请求都会失败,但如果未指定标题,请求就会起作用。但是为什么呢?