Spring MVC上传文件的方法总结

         Spring MVC对文件上传提供了很好的支持,但是很多新手可能会由于一些细节不注意经常会出这样或那样的问题,今天我就打算把这几天在使用过程中所遇到的问题记录并分享一下,如若不对,还望批评指正。

jar包配置

      <!-- Spring jar包 -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>3.2.8.RELEASE</version>
      </dependency>
      <!-- 配置fileupload 支持文件上传,不然功能无法使用 -->
      <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
      </dependency>

 Spring MVC配置文件: 

   <!-- 配置Spring组件扫描 -->
    <context:component-scan base-package="controller"/>
    <!-- 配置Spring MVC注解扫描 -->
    <mvc:annotation-driven/>
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!-- 配置文件处理器multipart -->
    <!-- 为什么使用commont包下的文件处理器就报错 :因为没有导jar包-->
    <bean id="multipartResolver"
         class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

 页面:

       表单提交方式必须是post,且必须加上enctype属性,指定数据格式为multipart/form-data

        <!-- enctype属性必须要加不然报错 -->
        <form action="upfile.do" method="post" enctype="multipart/form-data" >
        <p>头像<input type="file" name="file"></p>
        <input type="submit" value="上传">
        </form>

控制层方法:

        @RequestMapping("upfile.do")
        public String upFile(MultipartFile file,HttpServletRequest request){
            //如果文件为null抛异常
            if(file==null){
                System.out.println("file is null");
                return "erroe";
            }
            
            String Originalname = file.getOriginalFilename();
            String type = file.getContentType();
            long size = file.getSize();
            String name = file.getName();
           

           System.out.println("Originalname:"+Originalname+"  type:"+type+
                    "  size:"+size+"  name:"+name);
            
            //把文件存入指定文件夹
            File img = new File("F:"+File.separator+"test4"+File.separator+"img");
            //创建目录
            if(!img.exists()){
                img.mkdirs();
            }
            
            //给文件起名
            String names = Originalname;
            //文件保存的位置
            File imgs = new File("F:"+File.separator+"test4"+File.separator+"img"+File.separator+names);
            long start = System.currentTimeMillis();    
            try {
                
                //使用文件输出流(方法一)
//                byte[] f = file.getBytes();
                //创建一个图片文件输出流
//                FileImageOutputStream fos = new FileImageOutputStream(imgs);
//                fos.write(f);
//                fos.close();
            
                //MultipartFile提供的文件上传的方法(方法二)
//                file.transferTo(imgs);
                
                //使用MultipartHttpServletRequest(方法三)
                MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
                //获得该请求下的所有的文件并存进一个map,key为表单上的name属性值
                Map<String,MultipartFile> files = multipartRequest.getFileMap();
                //获得自己想要的文件
                MultipartFile imgFile = files.get("file");
                //此时的imgFile相当于这个方法参数file,这里是手动取
                imgFile.transferTo(imgs);
            } catch (IOException e) {
                    e.printStackTrace();
                }
            long endtime = System.currentTimeMillis();
            System.out.println("文件上传的时间为:"+(endtime-start)+"毫秒");
            
            return "success";
        }

 经测试上传一个12.5k的图片文件三种方法用时情况如下

     方法一:34毫秒

     方法二:6毫秒

     方法三:4毫秒

    当文件越大时,方法二速度更快,这里建议使用方法二

   参考文章:https://www.cnblogs.com/zhangzhen894095789/p/6475033.html

 

 

 

   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值