当前位置: 首页 > 面试题库 >

通过xmlHttpRequest多部分发送文件

淳于嘉树
2023-03-14
问题内容

我可以将文件作为多部分发送XMLHttpRequest到servlet吗?我正在制作表单并将其作为多部分提交,但是以某种方式我没有收到成功上传它的回复。我不希望刷新页面,因此它必须由ajax进行。


问题答案:

只有使用XHR FormDataAPI(以前称为“
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名称的一部分在服务器端可用myFile

您需要记住,FormData较旧的浏览器不支持API。在caniuse.com上,您可以看到它目前已在Chrome
7 +,Firefox 3.5 +,Safari 5 +,IE 10+和Opera 12+中实现。

另一种方法是使用jQuery
Form插件
。您的整个表单在编写并正常运行而无需使用任何JavaScript代码的情况下,将立即通过以下代码行进行修饰:

$("#formId").ajaxForm(function(response) {
    // Handle ajax response here.
});

它还通过隐藏的iframe技巧支持文件上传。另请参阅此jQuery
Form文档以获取详细说明。您可能只需要更改servlet代码,以便能够在正常(同步)和ajax(异步)请求上进行拦截。

无论哪种方式,上传的文件都可以在servlet的doPost()方法中使用@MultipartConfig,如下所示:

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

或者,如果您仍在使用Servlet 2.5或更早版本,请按常规方式使用Apache Commons
FileUpload。



 类似资料:
  • 我已成功发送多部分pdu短信, 问题是,当我试图将此SMS发送到不同网络上的号码时,它会给我以下错误: 请谁能告诉我我该怎么做。

  • 我有两台服务器,其中服务器A向服务器B发送文件。在服务器B上,我有一个接收给定类别文件的endpoint。这是我需要将文件发送到的endpoint的签名: 现在我在用RESTTemplateExchange创建这样的请求时遇到了麻烦。在服务器A上,我试图逐个发送文件(服务器B上的endpoint需要接受多部分数组,因为它也在其他地方使用)。这就是我所尝试的: 这几乎工作,唯一的问题是,在服务器B从

  • 这是在服务器端作为接收的内容: 如何转换multipart Confont数据类型中的文章对象?我读到改造可能允许使用转换器为这个。就我对文档的理解而言,它应该是实现的东西。 多部分部件使用的转换器,或者它们可以实现来处理自己的序列化。 null

  • 问题内容: 您好,我尝试使用Java中的客户端-服务器类发送文件。由于某种原因,当调用发送文件的方法时,套接字关闭。这是代码: 和来自客户端的代码: 和我得到的错误消息:严重:null java.net.SocketException:套接字已关闭 我对此并没有真正的经验,所以如果有帮助的话会很棒。 问题答案: 该方法返回一个,代表它实际读取的字节数。不能保证从字节数组中读取所需的字节数。它通常会

  • 如何通过Azure从我的UWP-App向不同设备上的应用程序的其他实例发送推送通知? 以下是注册设备以接收推送的说明。(这是可行的)第二部分是关于如何在控制台应用程序上发送推送(这也是可行的)https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-windows-store-dotnet-get-star

  • 我使用了代码从这里如下,只得到了一半的图片发送,谁能告诉我原因吗?获取大小和读取大小的代码对我来说太复杂了,所以我搞不清楚。 正如@EJP评论的那样,最可能的问题是在receive部分,InputStream.Read(Byte[]byteArray)不能完全加载byteArray。如果我使用dataInputStreamdis=new DataInputStream(inputStream),那