springmvc的multipart文件上传

上传文件三要素:
这里写图片描述
我们知道,一般表单提交的参数都是很简单的,就是以“&”分割的name-value对,但是这种简单的编码形式只基本能满足基于文本的表单提交,对于传输二进制数据,类似文件上传等,就显的力不从心了,与之不同的是,multipart格式的数据会将一个表单拆分为多个部分(part),每个部分对应一个输入域,一般表单输入域,其所对应的的部分是放置文本型数据,文件上传对应的是二进制,如:
这里写图片描述
可以看到在multipart请求中有一个Content-Type: application/octet-stream表示传输的二进制流,而不是简单的文本。
尽管multiaprt请求看起来比较麻烦,但这些在springMVC处理起来很容易,只需要配置一个multapart解析器,告诉DispatcherServlet如何读取multipart请求
spingmvc的 前端控制器DispatcherServlet并没有实现任何解析multipart请求数据的功能,他是通过Spring中的multipartResolver策略接口实现的,通过其实现类解析multipart请求中的内容,
从Spring3.1开始,spring内置了两个multipartresolver的实现类供我们选择:
CommonsMultipartResolver:使用Jakarta Commons FileUpload 解析multipart请求。
StandardServletMultipartResolver:依赖于servlet(3.0)对multipart请求的支持
StandardServletMultipartResolver使用的servlet所提供的功能支持,并不需要依赖jar包,
配置解析器:
@Bean
public MultipartResolver multipartResolver()throws IOException{
return new StandardServletMultipartResolver();
}
如果需要设置上传文件大小限制等相关参数,需要在Servlet中指定multipart的配置,也就是说需要在web.xml或servlet初始化类中对multipart进行属性配置(即在DispatchServlet中配置)。
在servlet初始化类中进行配置:
将文件上传临时路径设置为:/tmp/spittr/uploads
这里写图片描述
或者重载customizeRegistration() 方法(得到一个Dyamic作为参数)
这里写图片描述
或者直接在web.xml中进行配置:
这里写图片描述

处理multipart请求:

@Controller
@RequestMapping(value = "/file2")
public class FileController2 {

    /**
     * 在方法签名中使用MulitpartHttpServletRequest类型。
     * 
     * @param request
     * @return
     */
    @RequestMapping(value = "/commUploadB")
    @ResponseBody
    public JSONObject commUploadB(MultipartHttpServletRequest request) {
        JSONObject json = new JSONObject();
        json.put("succ", false);
        try {
            MultipartFile file = request.getFile("uploadFileB");// 与页面input的name相同
            File imageFile = new File("d:/upload2.jpg");// 上传后的文件保存目录及名字
            file.transferTo(imageFile);// 将上传文件保存到相应位置
            json.put("succ", true);
            return json;
        } catch (Exception e) {
            e.printStackTrace();
            return json;
        }
    }

    /**
     * 在方法签名中使用MultipartFile类型,并使用@RequestPart注解。
     * 
     * @param uploadFileC
     * @return
     */
    @RequestMapping(value = "/commUploadC")
    @ResponseBody
    public JSONObject commUploadC(@RequestPart("uploadFileC") MultipartFile uploadFileC) {
        JSONObject json = new JSONObject();
        json.put("succ", false);
        try {
            File imageFile = new File("d:/upload3.jpg");// 上传后的文件保存目录及名字
            uploadFileC.transferTo(imageFile);// 将上传文件保存到相应位置
            json.put("succ", true);
            return json;
        } catch (Exception e) {
            e.printStackTrace();
            return json;
        }
    }
}

后一种类似:
这里写图片描述
当表单提交时profilePicture属性会给定一个byte数组,该数组中包含请求中对应part的数据,如果未上传文件该值为”“(不是null),
但是使用原始的byte上传文件比较简单且功能有限,不过,Spring还提供MultipartFile接口,它为处理multipart提供了丰富的对象:
这里写图片描述
transferTo(new File(“服务器路径”)),就可以将上传文件保存到服务器。
以part的形式接受上传的文件
这里写图片描述
注:part接口与multipartFile并没有太大的区别,但是如果使用Part参数形式接收文件上传,那就没必要配置multipartResolver了,只有使用multipartFile的时候才需要配置MultipartResolver,
这里写图片描述
write(“服务器路径”),就可以将上传文件保存到服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值