文件下载

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属性来控制表单类型,

value purpose
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();}}

测试结果

上传界面:

上传成功后存储位置:

SpringMVC 文件上传及下载相关推荐

  1. SpringMvc文件上传和下载

    最近博主在做SpringMvc文件上传和下载的功能实现,上网查了很多资料很多都不太符合理想,找啊找,终于找到一个可以用的,然后再此基础上,我加以改进,可以支持多文件上传,而且代码非常精简,大家可以看看 ...

  2. 【Spring】SpringMVC文件上传与下载

    对于上传功能,我们在项目中是经常会用到的,比如用户注册的时候,上传用户头像,这个时候就会使用到上传的功能.而对于下载,使用场景也很常见,比如我们项目中有个使用说明是是pdf版的,会提供给用户进行下载的 ...

  3. spring-mvc文件上传与下载

    上传: 下载: 所依赖的包: 核心servlet: applicationContext.xml: 转载于:https://www.cnblogs.com/mywawa/p/6970260.html

  4. Springmvc文件上传(servlet3.0)/下载(ssm)以及坑点

    前言 (补充:再linux服务器上可能没用创建文件的权限,那就需要找到文件夹给权限,比如我的chmod -R 777 /home/tomcat/apache-tomcat-default/webapp ...

  5. springMVC的文件上传于下载

    springMVC的文件上传于下载 1.springmvc 文件的上传也是借助于两个工具所以需要添加两个jarapache-commons-fileupload.jarapache-commons-i ...

  6. SpringMVC——文件上传下载,异步请求和SSM整合

    一,SpringMVC文件上传下载 1.1 同步 1.1.1 文件上传 第一步:定义上传表单 <form action="${pageContext.request.contextPa ...

  7. 最全面的SpringMVC教程(五)——文件上传与下载

    前言 本文为 [SpringMVC教程]文件上传与下载 相关知识,具体将对使用MultipartResolver处理文件上传的步骤,两种文件下载方式(直接向response的输出流中写入对应的文件流. ...

  8. 使用SpringMVC框架实现文件上传和下载功能

    使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!-配置文件上传解释器 --> <mvc:annotation-driven>&l ...

  9. SSM之SpringMVC 04 —— Ajax、拦截器、文件上传和下载

    系列文章 SSM之SpringMVC 01 -- SpringMVC原理及概念.Hello SpringMVC 注解版和配置版 SSM之SpringMVC 02 -- Controller和RestF ...

最新文章

  1. 在Linux系统中修改目录的权限如何恢复
  2. vivo7.0系统机器(亲测有效)激活Xposed框架的教程
  3. HALCON基于形变的模板匹配实现
  4. mysql调试索引_10 分钟让你明白 MySQL 是如何利用索引的?
  5. CSS命名方法(笔记)
  6. 养成一个习惯需要多久?
  7. ALB Ingress 发布,轻松应对云原生应用流量管理
  8. 获取商品列表(Feign)
  9. django-orm-查询基本操作
  10. textarea不可拖动
  11. Windows移动开发(一)——登堂入室
  12. 微信小程序picker中的rang 和rang-key
  13. 使用“牛顿迭代法”求解方程
  14. 完成图书管理系统类图的绘制_中小学图书馆图书管理系统软件
  15. sha256算法细节详解
  16. 架设自己的邮件服务器
  17. mac修改终端显示前缀
  18. 机器学习进阶-阈值与平滑-图像阈值 1. cv2.threshold(进行阈值计算) 2. 参数type cv2.THRESH_BINARY(表示进行二值化阈值计算)...
  19. Vue 富文本wangEditor3 (自动保存 快捷保存 激活工具栏...
  20. easywechat Api大全

热门文章

  1. C语言,编写函数exchangeMaxMin(int arr[],int n),将该数组中最大最小值交换位置;
  2. Android udp json+数组 ---gt;bytes发送数据
  3. 【C语言】一堆数组中存放了10个小于100的整数,请编程对所有数据按照从小到大的顺序进行排序,若个位数相等,则按照十位从小到大的顺序排序,输出排序后的结果...
  4. 通用职责分配软件原则之1-信息专家原则
  5. json写入数据库或生成excel
  6. 为什么要远离对日外包_远离魔法-或:为什么我不想再使用Laravel
  7. firebase使用_使用Firebase进行物联网原型设计:如何事半功倍
  8. java springMVC生成二维码
  9. 不到 100 行 Python 代码徐峥变葛优
  10. 10个必会的 PyCharm 技巧,附高清大图