SpringMVC之文件上传下载

文件上传与下载

1.1、文件上传

1、将本地文件复制到服务器上(文件路径保存在数据库,文件上传的服务器某个路径下!)
2、SpringMvc中的文件上传是对原生文件上传的封装,减少代码量,提高效率

1.2.1、文件上传对于表单三要素:

(1)表单的提交方式必须是Post请求(因为Get对于数据传输量有要求)
(2)表单中必须有一个文件上传项<input type="file" name="">
 (3)表单的enctype属性的值必须是multipart/form-data
       multipart/form-data:以多段(每一个表单项为一个数据段)的形式进行拼接,以二进制流的形式发送给服务器(也就是说设置了multipart/form-data后request.getParameter()将会失效)

例:
在这里插入图片描述

1.2.2、文件上传时发送HTTP协议内容

HTTP请求报文由三部分构成:协议头、协议行、协议体

在这里插入图片描述

添加依赖

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.7</version>
</dependency>

1.3、上传解析器

MultipartResolver 用于处理文件上传,当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。如果请求数据中包含文件,则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest (继承了 HttpServletRequest) 对象中,最后传递给 Controller,在 MultipartResolver 接口中有如下方法:

boolean isMultipart(HttpServletRequest request); // 是否是 multipart
MultipartHttpServletRequest resolveMultipart(HttpServletRequest request); // 解析请求
void cleanupMultipart(MultipartHttpServletRequest request);

MultipartFile 封装了请求数据中的文件,此时这个文件存储在内存中或临时的磁盘文件中,需要将其转存到一个合适的位置,因为请求结束后临时存储将被清空。在 MultipartFile 接口中有如下方法:

String getName(); // 获取参数的名称
String getOriginalFilename(); // 获取文件的原名称
String getContentType(); // 文件内容的类型
boolean isEmpty(); // 文件是否为空
long getSize(); // 文件大小
byte[] getBytes(); // 将文件内容以字节数组的形式返回
InputStream getInputStream(); // 将文件内容以输入流的形式返回
void transferTo(File dest); // 将文件内容传输到指定文件中

执行过程:

在这里插入图片描述

1.4、配置上传解析器:

	//id="multipartResolver" 必须写,不写报错
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<!--属性可以不写(可以上传任意大小的文件)-->
	<!-- 设置上传文件的最大尺寸为1MB -->
	<property name="maxUploadSize">
		<!-- spring el写法:1MB -->
		<value>#{1024*1024}</value>
	</property>
     <!-- 效果同上 -->
<property name="maxUploadSize" value="1048576" />
</bean>

1.5、上传文件后台处理:

@Controller
public class MyController {
	//文件上传
	@RequestMapping("/upload")
    @ResponseBody
    public String upload(MultipartFile upload, HttpServletRequest req) throws IOException {
//上传表单信息:注意MultipartFile对象的名称必须与上传表单项的name属性值一致
//		System.out.println("上传文件是否为空:" + fileUpload.isEmpty());
//		System.out.println("上传文件的大小(字节):" + fileUpload.getSize());
//		System.out.println("上传文件的类型:" + fileUpload.getContentType());
//		System.out.println("上传表单name属性值:" + fileUpload.getName());
//		System.out.println("上传文件名:" + fileUpload.getOriginalFilename());
//      InputStream in = file.getInputStream();
        System.out.println(upload);
        upload.transferTo(new File(req.getServletContext().getRealPath("/")+upload.getOriginalFilename()));
        System.out.println(req.getServletContext().getRealPath("/")+upload.getOriginalFilename());

        return "succes";
    }

或者(使用了commons-io包的IOUtils):

@Controller
public class MyController {

	//文件上传
 @RequestMapping("/upload1")
    @ResponseBody
    public String upload1(MultipartFile upload, HttpServletRequest req) throws IOException {
        //1、利用MultipartFile的getInputStream()的方法获取输入流
        InputStream in = upload.getInputStream();
        //2、利用Request获取输出流的对象
        String s = req.getServletContext().getRealPath("/")+upload.getOriginalFilename();
        //3、创建输出流对象
        FileOutputStream out = new FileOutputStream(s);
        //4、commons-io包的IOUtils进行复制
        IOUtils.copy(in,out);
        //5、关闭流
        in.close();
        out.close();

        return "succes";
    }
}

2.1文件下载:

在这里插入图片描述

2.2、下载文件后台处理:

@Controller
public class DownloadController {

    @RequestMapping("download")
    @ResponseBody
    public String download(String name, HttpServletRequest req, HttpServletResponse resp) throws IOException {
//        System.out.println(req.getServletContext().getRealPath("/"));
        //1、创建服务器中存放资源的文件
        File file = new File(req.getServletContext().getRealPath("/"), name);
        //2、判断file文件是否存在
        if(file.exists()){
            //3、创建输入流
            FileInputStream in = new FileInputStream(file);

            //4.1、设置文件下载的名字  -- 附件表示做下载或上传操作,浏览器就不会将文件的内容直接显示出来了
            //4.2、URLEncoder.encode(name,"UTF-8")设置字符编码,如果不进行设置编码将会出现乱码
            resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(name,"UTF-8"));
            //5、利用response响应设置输出流
            ServletOutputStream out = resp.getOutputStream();
            //6、commons-io包的IOUtils进行复制
            IOUtils.copy(in,out);
            //7、关闭流
            in.close();
            out.close();
        }
        return "success";
    }
}

效果图

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值