我可以通过XMLHttpRequest将文件作为多部分发送到 servlet 吗?
我正在制作一个表单并将其作为多部分提交,但不知何故我没有收到成功上传它的回复。我不想刷新页面,所以它必须由 Ajax 进行。
我可以通过XMLHttpRequest将文件作为多部分发送到 servlet 吗?
我正在制作一个表单并将其作为多部分提交,但不知何故我没有收到成功上传它的回复。我不想刷新页面,所以它必须由 Ajax 进行。
这只能通过 XHR FormData
API 实现(以前称为“XHR2”或“XHR Level 2”的一部分,目前称为“XHR 高级功能”)。
鉴于此 HTML,
<input type="file" id="myFileField" name="myFile" />
你可以上传它如下:
var formData = new FormData();
formData.append("myFile", document.getElementById("myFileField").files[0]);
var xhr = new XMLHttpRequest();
xhr.open("POST", "myServletUrl");
xhr.send(formData);
XHR 将处理正确的标头和请求正文编码,并且在此示例中,该文件将作为form-data
name 的一部分在服务器端可用myFile
。
您需要记住,FormData
旧版浏览器不支持 API。在caniuse.com,您可以看到它目前已在 Chrome 7+、Firefox 3.5+、Safari 5+、Internet Explorer 10+ 和Opera 12+ 中实现。
如果您使用的是 jQuery,那么您可能会想使用它的$.val()
功能,如下所示:
formData.append("myFile", $("#myFileField").val());
但这是不正确的,因为它不返回整个File
对象,而只是返回文件名,因为String
它完全没有用,因为它不包含文件内容。
如果您document.getElementById()
出于某种原因不想使用,请改用以下方法之一:
formData.append("myFile", $("#myFileField").prop("files")[0]);
formData.append("myFile", $("#myFileField")[0].files[0]);
另一种方法是使用jQuery 表单插件。您的整个表单,在没有任何 JavaScript 代码行的情况下编写和正常运行时,将立即通过以下行进行ajax化:
$("#formId").ajaxForm(function(response) {
// Handle Ajax response here.
});
它还通过隐藏的 iframe 技巧支持文件上传。另请参阅此 jQuery 表单文档以获得深入的解释。您可能只需要更改 servlet 代码即可拦截普通(同步)和 Ajax(异步)请求。有关具体示例,另请参阅此答案:Simplecalculator with JSP/Servlet and Ajax
无论哪种方式,上传的文件都应该在servlet的doPost()
方法中可用,@MultipartConfig
如下所示:
Part myFile = request.getPart("myFile");
或者,如果您仍在使用 Servlet 2.5 或更早版本,请按常规方式使用 Apache Commons FileUpload。有关具体示例,另请参阅此答案:如何使用 JSP/Servlet 将文件上传到服务器?
无法multipart/form-data
使用 XMLHttpRequest发送(尽管在现代浏览器中可以使用XHR2
. 请参阅BalusC 的回答)。
实现您想要的一种常见方法是使用常规的form
,而是使用iframe
。这样,只有iframe
在上传时刷新。