SpringMVC使用MultipartFile实现文件上传?!

工作原理
*HTTP文件上传的基本原理:
*使用html的标签,提交form的几个属性必须为: method=post encType=multipart/form-data;
method属性必须设为post的原因:值不是放在URL之后传递到服务器的;
encType属性:这个属性管理的是表单的MIME编码;
服务器端:
WEB服务器端程序接收到"mutipart.form-data"类型的HTTP请求消息后,其核心和基本的编程工作就是读取请求消息中的实体内容,然后解析出每个分区的数据,接着再从每个分区中解析出描述头和主体内容的部分。
要在jsp里获得上传的文件,就是通过request.getInputStream()来得到上传的整个post实体的流,用request.getHeader(“Content-Type”)来取得实体内容的分界字符串,然后根据http协议,分析取得的上传的实体流,把文件部分筛出来,然后在服务器端保存到磁盘文件中,另外因为上传文件时,form的属性enctype=“multipart/form-data”,所以其他表单参数在上传文件时也无法得到,除了筛出文件进行保存,还应该把其他的参数一起取出保存,以便在jsp程序中调用。

配置文件
SpringMVC用的是MultipartFile来进行文件的上传,所以我们首先配置MultipartResolver用于处理表单中的file

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--设置请求编码格式-->
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="maxUploadSize" value="104857600"/>
        <property name="maxInMemorySize" value="4096"/>
    </bean>

其中:
defaultEncoding=“UTF-8” 是请求的编码格式,默认为iso-8859-1
maxUploadSize="" 是上传文件的大小,单位为字节
maxInMemorySize="" 是阀值,低于此值,只保存在内存里,高于此值,在硬盘中生成临时文件
uploadTemoDir=“fileUpload/temp” 为上传文件的临时路径

创建简单表单用于上传

<form name="frmupload" action="" method="post" enctype="multipart/form-data">
    上传人:<input id="name" type="text" name="name"/><br/>
    请选择文件:<input id="file" type="file" name="uploadfile"/><br/>
    <input type="submit" value="基于commons-fileuplad上传" onclick="check1()"/>
</form>

*注意:*在form标签中要加上enctype="multipart/form-data"表示该表单是要处理文件的。【很重要】

编写上传控制类
1.创建一个控制类:FileuploadController和一个返回结果的页面list.jsp
2.编写提交表单的action

@RequestMapping("/fileUpload1")
    public String handleFormUpload1(@RequestParam("name") String name, @RequestParam("uploadfile")List<MultipartFile> uploadfile,
                                    HttpServletRequest request, Model model){
        //判断所上传文件是否存在
        if (!uploadfile.isEmpty()&&uploadfile.size()>0){
            //循环输出上传的文件
            for (MultipartFile file:uploadfile){
                //获取上传文件的原始名称
                String originalFilename=file.getOriginalFilename();
                //设置上传文件的保存地址目录
                String dirPath=request.getServletContext().getRealPath("/upload/");
                File filePath = new File(dirPath);
                //如果保存文件的地址不存在,就先创建目录
                if (!filePath.exists()){
                    filePath.mkdirs();
                }
                //使用UUID重新命名上传的文件名称(上传人_uuid_原始文件名称)
                String newFilename=name+"_"+ UUID.randomUUID()+"_"+originalFilename;
                try {
                    //使用MultipartFile接口的方法完成文件上传到指定位置
                    file.transferTo(new File(dirPath+newFilename));
                }catch (Exception e){
                    e.printStackTrace();
                    model.addAttribute("msg","文件上传失败");
                    return "/jsp/success";
                }
            }
            //跳转到成功页面
            model.addAttribute("msg","文件上传成功");
            return "/jsp/success";
        }else {
            model.addAttribute("msg","文件上传失败");
            return "/jsp/success";
        }
    }

3.使用SpringMVC注解RequesParam来制定表单中的file参数;
4.指定一个用于保存文件的web项目路径;
5.通过MultipartFile的transferTo(File dest)这个方法来转存文件到指定的路径;
【文件名目录名或卷标语法不同问题!
不同的浏览器提交的文件名是不一样的,有些浏览器提交的文件命名是带有路径的。
如果遇到java.io.FileNotFoundException问题,尝试换浏览器,小编使用chrome浏览器,在使用IE打开时,出现此类问题。

完成。

MultipartFile类常用的一些方法:
String getContentType() 获取文件MIME类型;
InputStream getInputStream() 获取文件流
String getName() 获取表单中文件组件的名字
String getOriginalFilename() 获取上传文件的原名
long getSize() 获取文件的字节大小,单位为byte
boolean isEmpty() 判断是否为空
void transferTo(File dest) 保存到一个目标文件中

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值