一 前言

本文实现的文件下载是使用Apache 的 commons-fileupload 实现;在之前的springboot系列文件中已经讲述过如何实现多文件上传;这篇文件实现的文件下载功能主要是能在浏览器在线预览或者下载至本地;

二 pom依赖

	<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

三 文件下载示例

参数 path 表示相对于根路径的相对路径

参数userAgent 是为了兼容IE判断,如果使用谷歌,火狐浏览器就可以省略这个参数;

参数 filename 表示你下载至本地的文件名;

参数 inline表示是否要在线浏览,true是,false否;

/**
* @Author lsc
* @Description <p> 文件下载</p>
* @Date 2019/11/20 11:54
*/
@RestController
@RequestMapping("file")
public class DownloadController {
// 下载文件的根路径
private String downloadPath = "C:\\mydata\\generator"; @GetMapping("download")
public ResponseEntity<byte[]> downlaodFile(HttpServletRequest request, @RequestParam("path") String path
, @RequestHeader("user-agent") String userAgent, @RequestParam("filename") String filename
,@RequestParam(required = false,defaultValue = "false") boolean inline ) {
// 根路径加上传参数的路径构成文件路径地址
String realPath = downloadPath + path;
File file = new File(realPath);
// 构建响应
ResponseEntity.BodyBuilder bodyBuilder = ResponseEntity.ok();
bodyBuilder.contentLength(file.length());
// 二进制数据流
bodyBuilder.contentType(MediaType.APPLICATION_OCTET_STREAM);
// 文件名编码
try {
String encodeFileName = URLEncoder.encode(filename, "UTF-8");
// IE
if (userAgent.indexOf("MSIE")>0){
bodyBuilder.header("Content-Disposition","attachment;filename="+encodeFileName);
}else {
// 其他浏览器
if (inline){
// 在浏览器中打开
URL url = new URL("file:///" + file);
bodyBuilder.header("Content-Type",url.openConnection().getContentType());
bodyBuilder.header("Content-Disposition","inline;filename*=UTF-8''"+encodeFileName);
}else {
// 直接下载
bodyBuilder.header("Content-Disposition","attachment;filename*=UTF-8''"+encodeFileName);
} }
// 下载成功返回二进制流
return bodyBuilder.body(FileUtils.readFileToByteArray(file));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
// 下载失败直接返回错误的请求
return (ResponseEntity<byte[]>) ResponseEntity.badRequest(); } }

四 tomcat配置

主要是开发特殊字符斜杆,如果是在linux上开发,那就自定义路径,这个步骤可以省略;

@Configuration
public class ServerConfig { //Url路径添加支持字符
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
//设置Tomcate 支持
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.setProperty("relaxedQueryChars", "\\");
}
});
return factory;
} }

五 浏览器测试

下载路径

http://localhost:8080/file/download?path=\2019\11\c7ed67a6-5502-479b-8934-736021426236.jpg&filename=5555.jpg

生成结果

六 源码

github : youku1327

springboot-实现文件下载的更多相关文章

  1. SpringBoot的文件下载

    SpringBoot的文件下载 2017年11月29日 10:32:20 阅读数:3907 SpringBoot的文件下载方法有很多,此处只记录使用Spring的Resource实现类FileSyst ...

  2. SpringBoot/SpringMVC文件下载方式

    本篇文章引用外网博客代码,共描述SpringMVC下三种文件下载方式,本人测试在SpringBoot(2.0以上版本)正常使用. 引用博客,强烈推荐https://www.boraji.com. pa ...

  3. SpringBoot之文件下载

    package org.springboot.controller; import org.springboot.constant.Constant; import org.springframewo ...

  4. 用Springboot实现文件下载功能

    ApiOperation(value = "下载文件", httpMethod = "GET", notes = "downloadFile" ...

  5. SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)

    SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,SpringBoot致力于在蓬勃发 ...

  6. vue下载文件

    import fileDownload from 'js-file-download' let params = { ", ", "filename":&quo ...

  7. SpringBoot(三):文件下载

    SpringBoot(三):文件下载 2017年08月02日 10:46:42 阅读数:6882 在原来的SpringBoot–uploadfile项目基础上添加文件下载的Controller: @R ...

  8. Springboot文件下载

    https://blog.csdn.net/stubbornness1219/article/details/72356632 Springboot对资源的描述提供了相应的接口,其主要实现类有Clas ...

  9. springBoot中使用使用junit测试文件上传,以及文件下载接口编写

    本篇文章将介绍如何使junit在springBoot中测试文件的上传,首先先阅读如何在springBoot中进行接口测试. 文件上传操作测试代码 import org.junit.Before; im ...

  10. 对Web(Springboot + Vue)实现文件下载功能的改进

    此为 软件开发与创新 课程的作业 对已有项目(非本人)阅读分析 找出软件尚存缺陷 改进其软件做二次开发 整理成一份博客 原项目简介 本篇博客所分析的项目来自于 ジ绯色月下ぎ--vue+axios+sp ...

随机推荐

  1. Linux 正文处理命令及tar命令 利用vi编辑器创建和编辑正文文件

    要点回顾 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cp /etc/passwd . cat ./passwd >1.txt cp /etc/group ...

  2. bnu 52037 Escape from Ayutthaya

    Escape from Ayutthaya Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on CodeFo ...

  3. oracle优化EXPORT和IMPORT

    使用较大的BUFFER(比如10MB , 10,240,000)可以提高EXPORT和IMPORT的速度. ORACLE将尽可能地获取你所指定的内存大小,即使在内存不满足,也不会报错.这个值至少要和表 ...

  4. 洛谷 1131 [ZJOI2007] 时态同步

    题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...

  5. HTTP协议详解以及URL具体访问过程(转载)

    https://blog.csdn.net/f45056231p/article/details/82533490

  6. jieba完整文档

    jieba “结巴”中文分词:做最好的 Python 中文分词组件 "Jieba" (Chinese for "to stutter") Chinese tex ...

  7. 基于BERT预训练的中文命名实体识别TensorFlow实现

    BERT-BiLSMT-CRF-NERTensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tuni ...

  8. 在 CentOS 7.3 上安装 nginx 服务为例,说明在 Linux 实例中如何检查 TCP 80 端口是否正常工作

    CentOS 7.3 这部分以在 CentOS 7.3 上安装 nginx 服务为例,说明在 Linux 实例中如何检查 TCP 80 端口是否正常工作. 登录 ECS 管理控制台,确认实例所在安全组 ...

  9. laravel的Eloquent关联关系

    1.简介: 1>Eloquent 关联关系以Eloquent模型类方法的形式被定义(是模型类的一个方法). 2>同 Eloquent 模型本身一样,关联关系也是强大的查询构建器,定义关联关 ...

  10. PhpStorm terminal无法输入命令的解决方法

    下面小编就为大家带来一篇PhpStorm terminal无法输入命令的解决方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   在使用PhpStorm时,点击下面的 ...