目錄
正文
本文講解多文件上傳方法,不比較上傳有幾種方法和效率,而是定向分析apache的httpmime包的MultipartEntityBuilder類,源碼包:httpmime-4.5.2.jar
一、常用用法
1.上傳文件
三個傳值方法,addPart、addBinaryBody、addTextBody如下圖:
1 MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); 2 entityBuilder.addBinaryBody("file",new byte[]{},ContentType.DEFAULT_BINARY,"file.jpg"); 3 entityBuilder.addPart("owner","111"); 4 entityBuilder.addTextBody("paramter1", "aaa");
2.接收文件
1 //將當前上下文初始化給 CommonsMutipartResolver (多部分解析器) 2 CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext()); 3 //判斷是否多文件上傳 4 if(multipartResolver.isMultipart(request)){ 5 //將request變成多部分request 6 MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request; 7 Map<String,Object> map=multiRequest.getParameterMap(); 8 //獲取multiRequest 中所有的文件名 9 Iterator<String> iter=multiRequest.getFileNames(); 10 //遍歷所有文件 11 while(iter.hasNext()){ 12 MultipartFile file=multiRequest.getFile(iter.next().toString()); 13 //to do 14 } 15 }
二、注意點
注意點1,使用addBinaryBody的坑
首先看看源碼:
MultipartEntityBuilder 的 addBinaryBody 有6種不同用法,一般都是上傳File即可。着重看下圖2個紅色名字的方法。
源碼如下:
1 public MultipartEntityBuilder addBinaryBody( 2 final String name, final byte[] b, final ContentType contentType, final String filename) { 3 return addPart(name, new ByteArrayBody(b, contentType, filename)); 4 } 5 6 public MultipartEntityBuilder addBinaryBody( 7 final String name, final byte[] b) { 8 return addBinaryBody(name, b, ContentType.DEFAULT_BINARY, null); 9 } 10 11 public MultipartEntityBuilder addBinaryBody( 12 final String name, final File file, final ContentType contentType, final String filename) { 13 return addPart(name, new FileBody(file, contentType, filename)); 14 } 15 16 public MultipartEntityBuilder addBinaryBody( 17 final String name, final File file) { 18 return addBinaryBody(name, file, ContentType.DEFAULT_BINARY, file != null ? file.getName() : null); 19 } 20 21 public MultipartEntityBuilder addBinaryBody( 22 final String name, final InputStream stream, final ContentType contentType, 23 final String filename) { 24 return addPart(name, new InputStreamBody(stream, contentType, filename)); 25 } 26 27 public MultipartEntityBuilder addBinaryBody(final String name, final InputStream stream) { 28 return addBinaryBody(name, stream, ContentType.DEFAULT_BINARY, null); 29 }
如上圖:需要特別注意 傳byte[]字節數組時,必須使用4參傳值,且第四參必須帶後綴名:
entityBuilder.addBinaryBody("file",new byte[]{},ContentType.DEFAULT_BINARY,"fileName.jpg");
如果使用上圖中兩參的,最後fileName不傳,默認爲null,會導致接收文件時multiRequest.getFileNames()(見1.2接收方法代碼)爲空!就會獲取不到文件!
注意點2 isMultipart:
multipartResolver.isMultipart(request),這裏判斷是否爲多文件上傳,要求
1.方法爲POST。
2.contentType以"mutipart/"開頭。源碼追蹤如下: