SpringMVC 文件上传及下载

文件下载

inline

访问资源时如果没有设置响应头Content-Disposition,浏览器默认按照inline进行处理
inline:能显示就显示,不能显示就下载

响应头

只需修改响应头Content-Disposition=“attachment;filename=文件名”
attachment表示下载,以附件形式下载
filename表示下载时,下载的文件名

实现步骤

①jsp中添加超链接,设置要下载的文件
Ps:超链接实质是传输到服务器一个文件名,而这个文件一定是存在的,也可以使用一个输入框,输入要下载的文件名,然后查询该文件是否存在,以此来实现选择指定的文件来下载。

②控制器定义方法为void类型,参数使用filename(接收文件名),HttpServletResponse res(定位文件位置),HttpServletRequest req(转发资源)

③使用res设置响应头:
res.setContentType(“application/x-msdownload”)和res.setHeader(“Content-Disposition”," ")

④使用res获取字节输出流:res.getOutputStream()

⑤使用req获取到文件路径:req.getServletContext().getRealPath(“files”)+"/"+fileName

⑥再将文件转为byte数组(可使用Commons-IO,也可通过ByteArrayInputStream进行转换),通过res获取到的流输出并刷新。

具体实现

超链接:

<a href="/SpringMVCTest/download?filename=Test.zip">下载文件</a>

控制器:

@RequestMapping("/download")
 public void download(String filename,HttpServletResponse res,HttpServletRequest req) {
  	//获取到文件路径(此处不知为何将files放入参数中会找不到)
  	String path = req.getServletContext().getRealPath("")+"files";
  	try {
   		byte data[] = FileUtils.readFileToByteArray(new File(path,filename));
   		//修改响应头
   		res.setContentType("application/x-msdownload");
   		res.setHeader("Content-Disposition", "attachment;filename="+filename);
   		//获取输出流
   		OutputStream oStream = res.getOutputStream();
   		oStream.write(data);
   		oStream.flush();
   		oStream.close();
  	} catch (IOException e) {
   		e.printStackTrace();
  	}
 }
测试结果

文件位置:
在这里插入图片描述
下载页面:
在这里插入图片描述

第二种下载方法

HttpMessageConverter<T>(消息处理器)
1)、作用
将请求信息转化并绑定到处理方法的形参中或将响应结果转为对应类型的响应信息

2)、使用途径
注解:@RequestBody/@ResponseBody
参数/返回值:HttpEntity<T>/RsponseEntity<T>
当控制器进行使用时,会先根据请求头或响应头的Accept属性选择匹配的HttpMessageConvert
进而根据参数类型或范型类型的过滤得到匹配的HttpMessageConverter,找不到会报错
Ps:当加入jackson.jar时,会默认多添加一个解析json的类

3)、可以使用ResponseEntity实现文件的下载
①使用注解@ResponseBody并将返回值设置为RsponseEntity<byte[]>

②构建一个RsponseEntity<byte[] >对象

③传入参数:文件数据字节数组、响应头(以附件形式下载,HttpHeader)、响应状态(HttpStatus.enumValue)




文件上传

基于apache的commons-fileupload.jar完成文件上传

MultipartResolver(组件)

①将客户端上传的文件流转换为MutipartFile封装类
②通过MutipartFile封装类获取到文件流

jsp页面

通过<form>的enctype属性来控制表单类型,

valuepurpose
application/x-www-form-urlencoded少量文字信息(默认)
text/plain表示大量文字类型(邮件、论文等)
multipart/form-data表单中包含二进制文件内容(上传文件)

通过method属性来控制访问类型:
“POST”,最大值2GB,字节流;GET,最大2K,字符流

SpringMVC配置文件

配置MultipartResolver解析器:
<bean id="" class=“org.springframework.web.multipart.commons.CommonsMultipartResolver”/>
属性值:
maxUploadSize,文件最大上传,单位字节,超过会报异常
defaultEncoding,默认编码

实现步骤

①设置参数MultipartFile filename来获取到上传的文件(
形参名和表单中文件上传的name相同,即<input type=“file” name=“filename”>
或使用@RequestParam(“filename”)进行注入

②通过file.getOriginalFilename()来获取文件全称,再通过substring获取文件后缀(用以确认文件类型)

③通过UUID.randomUUID().toString()来获取一个唯一标识符和文件后缀进行拼接获取文件名Ps:此处可使用数据库将文件名和生成的UUID建立起key-value关系,便于下载

④通过file.getInputStream()获取输出流

⑤可通过Commons-IO将输出流输入到一个新文件中
Tips:防止别人访问,可在filter中过滤id

具体实现

jsp端表单:

<form action="/SpringMVCTest/upload" enctype="multipart/form-data" method="POST">
  	上传文件:<input type="file" name="file">
  	<input type="submit" name="提交">
 </form>

SpringMVC配置文件

<!-- 文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      	<!-- 最大文件大小 -->
      	<property name="maxUploadSize" value="20480"></property>
      	<!-- 默认编码 -->
      	<property name="defaultEncoding" value="UTF-8"></property>
</bean>

控制器:

@RequestMapping("/upload")
 public void upload(@RequestParam("file")MultipartFile file,ServletRequest req) {
  	//获取路径
  	String path = file.getOriginalFilename();
  	//获取文件后缀(类型)
  	String last = path.substring(path.lastIndexOf("."));
  	String name = UUID.randomUUID().toString()+last;
  	//获取上传文件的输入流
  	try {
   		InputStream iStream = file.getInputStream();
   		FileUtils.copyInputStreamToFile(iStream ,new File(req.getServletContext().getRealPath("")+"files",name));
   		iStream.close();
  	} catch (IOException e) {
   		e.printStackTrace();
  	}
 }
测试结果

上传界面:
在这里插入图片描述

上传成功后存储位置:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值