SpringMVC使用ResponseEntity实现文件下载,及图片base64的字节数组上传于下载
本文主要通过ResponseEntity<byte[]>实现文件下
该类实现响应头、文件数据(以字节存储)、状态封装在一起交给浏览器处理以实现浏览器的文件下载。
ResponseEntity参数解释:ResponseEntity(T body, MultiValueMap<String, String> headers, HttpStatus statusCode)
其中ResponseEntity<T> extends HttpEntity<T>,很明显的继承关系,HttpEntity是一个实体类,在new ResponseEntity<byte[]>(b, headers, statusCode);这句初始化的时候,会将T body, MultiValueMap<String, String> headers两个参数传给父类,本类中存放状态码,在HttpEntity类的源码中可以看到:
public HttpEntity(T body, MultiValueMap<String, String> headers) {
this.body = body;
HttpHeaders tempHeaders = new HttpHeaders();
if (headers != null) {
tempHeaders.putAll(headers);
}
//将header头转变成只能读取的对象,而不是写入的对象。
this.headers = HttpHeaders.readOnlyHttpHeaders(tempHeaders);
}
HttpHeaders类说明:表示HTTP请求和响应头,将字符串头名映射到字符串值的列表。
在这里为什么要用HttpHeaders类,是因为MultiValueMap接口的实现类是:HttpHeaders、LinkedMultiValueMap以及静态类MultiValueMapAdapter
话不多说直接上代码:
//下载练习
@GetMapping("/download")
public ResponseEntity<byte[]> download(@RequestParam(name = "id") Long id, HttpServletRequest request) {
TemplateDto byId = getBaseService().findById(id);
HttpHeaders headers = new HttpHeaders();
String fileName = null;
try {
fileName = FileExtraUtils.handleFileName(request, "download.pdf");
} catch (UnsupportedEncodingException e) {
//ignore
log.warn("文件名处理出错", e);
}
headers.setContentDispositionFormData("attachment", fileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); //二进制流(或者字节数组)的形式返回 return new ResponseEntity<>(byId.getTemplaeContent(), headers, HttpStatus.OK);
} 或者根据临时文件保存的路径获取输入流,然后copy给输出流进行下载
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = new FileInputStream(filePath);
outputStream = response.getOutputStream();
response.setContentType("application/x-download");
response.addHeader("Content-Disposition", "attachment;filename=" + info.getFileName());
IOUtils.copy(inputStream, outputStream);
outputStream.flush();
}catch (Exception e){
e.printStackTrace();
}finally {
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
}
//上传文件并保存
@PostMapping("/upload")
public void upload(@Param("file") MultipartFile file, HttpServletResponse response) throws IOException {
File tempFile;
try {
tempFile = File.createTempFile(file.getOriginalFilename(), ".pdf");
file.transferTo(tempFile);
HashMap data = new HashMap();
data.put("fileName", tempFile.getCanonicalPath());
data.put("displayName", file.getOriginalFilename());
ResultDto dto = ResultDtoFactory.toAckData(data);
response.setContentType("text/html; charset=utf-8");
response.getWriter().write(JSON.toJSONString(dto));
} catch (IOException e) {
log.error("保存文件失败", e);
ResultDto dto = ResultDtoFactory.toNack("文件上传失败");
response.setContentType("text/html; charset=utf-8");
response.getWriter().write(JSON.toJSONString(dto));
}
} @Override
public ResultDto create(TemplateDto templateDto) {
String fileName = templateDto.getFileName();
try (FileInputStream fis = new FileInputStream(new File(fileName))) {
templateDto.setTemplaeContent(IOUtils.toByteArray(fis));
} catch (IOException e) {
log.error("读取模版内容出错", e);
return ResultDtoFactory.toNack("读取模板内容出错,请重新上传");
}
getBaseService().save(templateDto);
return ResultDtoFactory.toAck();
}
//另外图片的上传于下载
@PostMapping("/upload")
public void upload(@RequestParam String configKey, MultipartFile file, HttpServletResponse response) throws IOException {
ConfigDto configDto = new ConfigDto();
configDto.setConfigKey(configKey);
String base64Content = Base64Utils.encodeToString(IOUtils.toByteArray(file.getInputStream()));
configDto.setConfigValue(base64Content);
configService.save(configDto);
ResultDto resultDto = ResultDtoFactory.toAck();
response.setContentType("text/html; charset=utf-8");
response.getWriter().write(JSON.toJSONString(resultDto));
} @GetMapping("/download")
public void download(@RequestParam(required = true) String configKey, HttpServletResponse response) throws IOException {
List<ConfigDto> byKey = configService.findByKey(configKey);
if (CollectionUtils.isNotEmpty(byKey)) {
ConfigDto configDto = byKey.get(0);
if(configDto!=null){
String base64Content = configDto.getConfigValue();
byte[] bytes = Base64Utils.decodeFromString(base64Content);
IOUtils.copy(new ByteArrayInputStream(bytes), response.getOutputStream());
response.getOutputStream().flush();
}
}
}
SpringMVC使用ResponseEntity实现文件下载,及图片base64的字节数组上传于下载的更多相关文章
- php中图片文件的导入,上传与下载
---------------------------------------------图片的导入-------------------------------------------------- ...
- vue实现PC端调用摄像头拍照人脸录入、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式
进入正题 1. PC端调用摄像头拍照上传base64格式到后台,这个没什么花里胡哨的骚操作,直接看代码 (canvas + video) <template> <div> &l ...
- 文件的上传和下载--SpringMVC
文件的上传和下载是项目开发中最常用的功能,例如图片的上传和下载.邮件附件的上传和下载等. 接下来,将对Spring MVC环境中文件的上传和下载进行详细的讲解. 一.文件上传 多数文件上传都是通过表单 ...
- SpringMVC文件上传和下载
上传与下载 1文件上传 1.1加入jar包 文件上传需要依赖的jar包 1.2配置部件解析器 解析二进制流数据. <?xml version="1.0" encoding=& ...
- PHP使用七牛云存储之图片的上传、下载、303重定向教程,CI框架实例
网上关于七牛云存储的教程除了官网上的API文档,其他的资料太少了.研究了下API之后,现在已经能实现图片的上传和下载及上传之后的重定向. http://blog.csdn.net/cqcre/arti ...
- .net mvc + layui做图片上传(二)—— 使用流上传和下载图片
摘要:上篇文章写到一种上传图片的方法,其中提到那种方法的局限性,就是上传的文件只能保存在本项目目录下,在其他目录中访问不到该文件.这与浏览器的安全性机制有关,浏览器不允许用户用任意的路径访问服务器上的 ...
- 基于SpringMVC的文件(增删改查)上传、下载、更新、删除
一.项目背景 摘要:最近一直在忙着项目的事,3个项目过去了,发现有一个共同的业务,那就是附件的处理,附件包括各种文档,当然还有图片等特殊文件,由于时间的关系,每次都是匆匆忙忙的搞定上线,称这项目的空档 ...
- SpringMvc的上传和下载
第一步:配置文件加入上传和下载的<bean>全部配置文件参考上上篇博文 <!-- 配置springMVC上传文件和下载文件 --> <bean id="mult ...
- SpringMVC下文件的上传与下载以及文件列表的显示
1.配置好SpringMVC环境-----SpringMVC的HelloWorld快速入门! 导入jar包:commons-fileupload-1.3.1.jar和commons-io-2.4.ja ...
随机推荐
- 题解 CF1216A 【Prefixes】
题目大意:给你一个长度为$n$($n$为偶数)的字符串,且这个字符串仅由$'a'$与$'b'$两种字符组成,要你用最少的操作次数使得 $s[i]!=s[i-1] (i/2=0,1≤i≤n)$(若字符串 ...
- 从零开始学Flask框架-005
表单 Flask-WTF 项目结构 pip install flask-wtf 为了实现CSRF 保护,Flask-WTF 需要程序设置一个密钥.Flask-WTF 使用这个密钥生成加密令牌,再用令牌 ...
- MySQL DBA的KPI考核指标有哪些
绩效考核是对一名员工所作工作的数量.质量.难度.强度.效率的量化考量.由于DBA的工作性质与纯粹的研发人员或运维人员有所区别,对DBA的KPI考核指标也有其特殊性.参考以往的经验和一些较大的DBA t ...
- create-react-app中的一些功能配置
1. 根路径别名@ 1. npm run eject调出配置文件.找到webpack.config.js,搜索到,alias,在下面添加一行键值对'@':paths.appSrc, alias: { ...
- Python通用爬虫,聚焦爬虫概念理解
通用爬虫:百度.360.搜狐.谷歌.必应....... 原理: (1)抓取网页 (2)采集数据 (3)数据处理 (4)提供检索服务 百度爬虫:Baiduspider 通用爬虫如何抓取新网站? (1)主 ...
- 基于MFC的网页ActiveX控件开发全程实录2(js向ActiveX控件传递参数)
原文转自 https://blog.csdn.net/qianbin3200896/article/details/81452822 1.ActiveX控件部分(JS到ActiveX控件)继续上一篇博 ...
- ABP 基于DDD的.NET开发框架 学习(四)时间控件采用datetimepicker注意事项
$('#datetimepicker1').datetimepicker({ format: 'yyyy/mm/dd hh:ii:ss',//这是只能用小写的大写的与ABP中的字母识别起冲突 loca ...
- ORACLE大对象存储
--创建有大对象字段的一张表 create table test001 ( fname varchar2(50), content blob ) select * from ...
- 关于Vue-ElementUI修改默认样式不成功问题解决
Element是一个很好用的组件库,但是有时候我们需要修改一些组件的样式以满足我们自己的需求. 我们用浏览器调试找到相应的class,在本地重写这个class时,发现修改不成功. 这是因为在Vue文件 ...
- vue导出Excel文件
1.需要安装file-saver和script-loader.xlsx npm install file-saver / yarn add file-saver npm install script- ...