SpringMVC的MultipartHttpServletRequest实现图片的上传

1.前言

这几天一直在调图片上传的接口,总结一下,想着也该写博客了,就从这篇开始吧。

2.MultipartHttpServletRequest

首先在SpringMVC中,对ServletAPI的HttpServletRequest接口进行了很好的扩展,使得其能够更好地处理文件上传,扩展后的接口名为MultipartHttpServletRequest。

interface MultipartHttpServletRequest extends HttpServletRequest{

public MultipartFile getFile(String name);//获取文件

public Map getFileMap();//获取多个文件,保存在map

public Iterator getFileNames();

}

如上所示:MultipartHttpServletRequest接口简单地扩展了默认的HttpServletRequest接口

3.使用multipart请求

只要发现一个multipart请求,就表明控制器当中存在一个实现了MultipartHttpServletRequest接口的request对象,我们可以通过上面的MultipartHttpServletRequest接口来访问multipart请求中的文件,下面的代码段显示为上传表单:

<form action="upload"enctype="multipart/form-data">

<input type="file" name="myFile"/>

<input type="submit" value="Upload! "/>

</form>

实际上,上传表单只需要满足两点,enctype属性的属性值设置为multipart/form-data,input的type属性的属性值设为file。
enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。
input的type属性是指提交的表单属于文件类型

描述
application/x-www-form-urlencoded在发送前编码所有字符(默认)
multipart/form-data不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
text/plain空格转换为 “+” 加号,但不对特殊字符编码。

注意:在上面提到的上传文件的input type必须为file,name可以自定义为myFile,name属性的用处是前面提到的getFile方法的参数,即根据name的值来获取文件

4.读取文件

MultipartFile multipartFile = multiRequest.getFile("file");

根据multiRequest的getFile方法获取到的文件类型不是file,而是MultipatFile类型,下面我们看看MultipatFile接口

interface MultipartFile {

public byte[] getBytes();

public String getContentType();

public java.io.InputStream getInputStream();

public String getName();

public String getOriginalFilename();

public long getSize();

public boolean isEmpty();

public void transferTo(java.io.File dest);

}

MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称,
在MultipartFile接口中定义了如下很多有用的方法。
l 使用getSize()方法获得文件长度,以此决定允许上传的文件大小。

l 使用isEmpty()方法判断上传文件是否为空文件,以此决定是否拒绝空文件。

l 使用getInputStream()方法将文件读取为java.io.InputStream流对象。

l 使用getContentType()方法获得文件类型,以此决定允许上传的文件类型。

l 使用transferTo(dest)方法将上传文件写到服务器上指定的文件。

5.图片上传接口实现

        private static final String basePath = "服务器存储图片地址";
        private static final String readPath = "读取图片地址";
        
		MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;//转换request,获取request中的文件
		MultipartFile multipartFile = multiRequest.getFile("file");//获取type name为file的文件

		InputStream inputStream = null;
		OutputStream outputStream = null;
		try{
			inputStream = multipartFile.getInputStream();//将文件读取为InputStream流对象
			String fileName = multipartFile.getOriginalFilename();//获取文件初始名
			String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
			String reName = UUID.randomUUID().toString() + "." + suffix;
			String relativePath ="banner/" +DateUtil.getCurrentDate() + "/" + reName; // 相对路径,即数据库存储的路径
			String savePath = basePath +'/'+ relativePath;  //处理文件上传的路径

            File file = new File(savePath);//根据文件路径创建文件
            if (!file.getParentFile().exists()) {//判断其父目录是否存在
                boolean result1 = file.getParentFile().mkdirs();//不存在则创建
                if (!result1) {
                    logger.error("Failed to initialize file directory,path=" + file.getParentFile());//初始化文件目录失败
                }
            }
            outputStream = new FileOutputStream(file);//创建该文件的输出流通道
            IOUtils.copy(inputStream, outputStream);//将从前台获取到的数据写入该输出流通道当中(即将图片存在服务器当中)
            }catch (Exception e){
			logger.error("file upload error:", e);
		}finally {
			if (inputStream != null) {
				inputStream.close();
			}
			if (outputStream != null) {
				outputStream.close();
			}
		}
            

参考网址: https://www.jianshu.com/p/e2795b9e7aaf

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值