设为首页 收藏本站
查看: 1216|回复: 0

[经验分享] apache的MultipartEntityBuilder文件上传

[复制链接]

尚未签到

发表于 2017-12-24 06:09:55 | 显示全部楼层 |阅读模式
  本文讲解多文件上传方法,不比较上传有几种方法和效率,而是定向分析apache的httpmime包的MultipartEntityBuilder类,源码包:httpmime-4.5.2.jar
  目录
  1.多文件上传常用用法
  2.注意点
  =======正文分割线===========

一、常用用法

1.上传文件
  三个传值方法,addPart、addBinaryBody、addTextBody如下图:
  

MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();  

entityBuilder.addBinaryBody("file",new byte[]{},ContentType.DEFAULT_BINARY,"file.jpg");  

entityBuilder.addPart("owner","111");  

entityBuilder.addTextBody("paramter1", "aaa");  


2.接收文件
  

//将当前上下文初始化给  CommonsMutipartResolver (多部分解析器)  
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(request.getSession().getServletContext());
  
  //判断是否多文件上传
  
  if(multipartResolver.isMultipart(request)){
  
      //将request变成多部分request
  
      MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
  
      Map<String,Object> map=multiRequest.getParameterMap();
  
      //获取multiRequest 中所有的文件名
  
      Iterator<String> iter=multiRequest.getFileNames();
  
      //遍历所有文件
  
      while(iter.hasNext()){
  
         MultipartFile file=multiRequest.getFile(iter.next().toString());
  
         //to do
  
      }
  
  }
  


二、注意点
  注意点1,使用addBinaryBody的坑
  首先看看源码:
  MultipartEntityBuilder 的 addBinaryBody 有6种不同用法,一般都是上传File即可。着重看下图2个红色名字的方法。
  源码如下:
  

     public MultipartEntityBuilder addBinaryBody(  

             final String name, final byte[] b, final ContentType contentType, final String filename) {  

         return addPart(name, new ByteArrayBody(b, contentType, filename));  

     }  

  
     public MultipartEntityBuilder addBinaryBody(
  
             final String name, final byte[] b) {
  
         return addBinaryBody(name, b, ContentType.DEFAULT_BINARY, null);
  
     }
  

  
     public MultipartEntityBuilder addBinaryBody(
  
             final String name, final File file, final ContentType contentType, final String filename) {
  
         return addPart(name, new FileBody(file, contentType, filename));
  
     }
  

  
     public MultipartEntityBuilder addBinaryBody(
  
             final String name, final File file) {
  
         return addBinaryBody(name, file, ContentType.DEFAULT_BINARY, file != null ? file.getName() : null);
  
     }
  

  
     public MultipartEntityBuilder addBinaryBody(
  
             final String name, final InputStream stream, final ContentType contentType,
  
             final String filename) {
  
         return addPart(name, new InputStreamBody(stream, contentType, filename));
  
     }
  

  
     public MultipartEntityBuilder addBinaryBody(final String name, final InputStream stream) {
  
         return addBinaryBody(name, stream, ContentType.DEFAULT_BINARY, null);
  
     }
  



  如上图:需要特别注意 传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/"开头。源码追踪如下:
DSC0000.png

DSC0001.png

DSC0002.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-427381-1-1.html 上篇帖子: Apache的httpd命令详解 下篇帖子: 高压锅里的小白
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表