org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException:


用ajax提交form表單上傳文件,出現以下錯誤

org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException: the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded; charset=UTF-8
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:947)
at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:310)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:334)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)
at com.qiye.EnterpriseServlet.update(EnterpriseServlet.java:252)
at com.qiye.EnterpriseServlet.doPost(EnterpriseServlet.java:91)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.filter.MyFilter.doFilter(MyFilter.java:90)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

 

通過 傳統的 form 表單提交的方式上傳文件:

<form id= "uploadForm" action= "http://localhost:8080/cfJAX_RS/rest/file/upload" method= "post" enctype ="multipart/form-data">  <h1 >測試通過Rest接口上傳文件 </h1>  <p >指定文件名: <input type ="text" name="filename" /></p>  <p >上傳文件: <input type ="file" name="file" /></p>  <p >關鍵字1: <input type ="text" name="keyword" /></p>  <p >關鍵字2: <input type ="text" name="keyword" /></p>  <p >關鍵字3: <input type ="text" name="keyword" /></p>  <input type ="submit" value="上傳"/> </form> 

不過 傳統的 form 表單提交會導致頁面刷新, 但是在有些情況下,我們不希望頁面被刷新,這種時候我們都是使用Ajax的方式進行請求的:

$.ajax({
 url : "http://localhost:8080/STS/rest/user",  type : "POST",  data : $( '#postForm').serialize(),  success : function(data) {   $( '#serverResponse').html(data);  },  error : function(data) {   $( '#serverResponse').html(data.status + " : " + data.statusText + " : " + data.responseText);  } }); 

如上,通過 $( '#postForm' ).serialize() 可以對form表單進行序列化,從而將form表單中的所有參數傳遞到服務端。

但是上述方式,只能傳遞一般的參數, 上傳文件的文件流是無法被序列化並傳遞的。

不過如今主流瀏覽器都開始支持一個叫做FormData的對象,有了這個FormData,我們就可以輕松地使用Ajax方式進行文件 上傳 了。

 

 

正確的方法是:

使用FormData,進行Ajax請求並上傳文件

這里使用JQuery,但是老版本的JQuery比如1.2是不支持的,最好使用2.0或更新版本:
<form id= "uploadForm"> <p >指定文件名: <input type="text" name="filename" value= ""/></p > <p >上傳文件: <input type="file" name="file"/></ p> <input type="button" value="上傳" onclick="doUpload()" /> </form>
function doUpload() {  var formData = new FormData($( "#uploadForm" )[0]);  $.ajax({   url: 'http://localhost:8080/cfJAX_RS/rest/file/upload' ,   type: 'POST',   data: formData,   async: false,   cache: false,   contentType: false,   processData: false,   success: function (returndata) {   alert(returndata);   },   error: function (returndata) {   alert(returndata);   }  }); }


一定要記得把form表單頭里面除了id以為的數據去掉,不然會報錯,為什么我也不知道



來自:http://www.tuicool.com/articles/IJrAna3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM