Java 如何使用XMLHttpRequest使用multipart上传文件?

Java 如何使用XMLHttpRequest使用multipart上传文件?,java,javascript,servlets,Java,Javascript,Servlets,这就是我正在做的 var url_action="/temp/SaveConfig"; var client; var dataString; if (window.XMLHttpRequest){ // IE7+, Firefox, Chrome, Opera, Safari client=new XMLHttpRequest(); } else { // IE6, IE5 client=new ActiveXObject(

这就是我正在做的

var url_action="/temp/SaveConfig";
 var client; 
 var dataString;

 if (window.XMLHttpRequest){ // IE7+, Firefox, Chrome, Opera, Safari
     client=new XMLHttpRequest();
 } else {                    // IE6, IE5
     client=new ActiveXObject("Microsoft.XMLHTTP");
 }

 client.onreadystatechange=function(){

     if(client.readyState==4&&client.status==200)
     {
         alert(client.responseText);

     }
 };

 //dataString=document.getElementById("tfile").value;
 client.open("POST",url_action,true);
 client.setRequestHeader("Content-type", "multipart/form-data"); 
 client.setRequestHeader("Connection", "close");     
 client.send();
但是在服务器端,我得到了org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为没有找到多部分边界

我哪里做错了

读了阿提库斯的回复后 这是我所做的,文件正在上传

var form=document.forms["mainForm"];

 form.setAttribute("target","micox-temp");
 form.setAttribute("action",url_action);
 form.setAttribute("method","post");
 form.setAttribute("enctype","multipart/form-data");
 form.setAttribute("encoding","multipart/form-data");
 form.submit();

但是现在我如何从servlet接收值来执行JSON之外的某种检查呢?

文件不能通过这样的异步请求进行传输。您需要以多部分形式提交


根据文件的类型,可以将数据存储在post变量中。

在即将发布的XMLHttpRequest版本2之前,不能使用Ajax上载文件

当前大多数基于Ajaxbased的文件上载程序都使用
黑客攻击。它使用JS代码创建一个不可见的
,其中表单被复制并同步提交。父页面将保持不变,看起来好像是异步完成的

为了获得最佳的交叉浏览器兼容性,并尽可能减少编写交叉浏览器兼容代码的麻烦,我强烈建议使用一个现有的JS库,它擅长处理ajaxical内容和遍历/操作HTMLDOM树,例如。它附带了过多的表单上传插件,最简单的一个是。它还支持通过隐藏的
黑客帮助上传文件。这基本上和


$(文档).ready(函数(){
$('#formid').ajaxForm(函数(数据){
//做些有反应的事情。
$('#result').text(data.result);
});
});
...
在服务器端,只需使用一个以通常方式处理请求的工具,可以使用提供的Servlet 3.0
HttpServletRequest\getParts()
或旧的Apache Commons FileUpload()

无论哪种方式,您都可以按照通常的方式返回JSON响应

Map<String, Object> data = new HashMap<String, Object>();
data.put("result", "Upload successful!");
// ...
response.setContentType("application/json");
resposne.setCharacterEncoding("UTF-8");
resposne.getWriter().write(new Gson().toJson(data));
Map data=newhashmap();
data.put(“结果”,“上传成功!”);
// ...
setContentType(“应用程序/json”);
响应setCharacterEncoding(“UTF-8”);
write(新的Gson().toJson(数据));

有关更多Ajax Servlet JSON示例,请查看。

您确实发送了什么吗?@Thomas:我只想发送文件。我需要添加这些行吗<代码>数据字符串=document.getElementById(“tfile”).value;setRequestHeader(“内容长度”,dataString.length);发送(数据字符串)t文件是输入类型的idfile@Atticus:谢谢你的回复,我更新了我的代码部分,请看一下。:)等待你成功地创建了一个文件?还是你postback@atticus:我没有理解您的意思,我只是使用了html文件中表单id之外的变量,并使用该表单的变量提交表单。您可以让服务器回显单个整数,它不必是JSON,但应该是JSON——编码是一种更安全的途径。您不需要将结果打印到页面,您可以将它们作为变量传递到页面。阅读一些关于此的文章感谢您的详细解释,我明天将尝试此方法并再次返回。我传递了一个字符串,其中变量用分隔符分隔
,并使用
splitOutput=client.responseText.split(“,”)
将值存储为变量以进行检查。这解决了我的问题。将来,我将尝试使用Json并考虑您的方法。谢谢你的帮助:)