# 微服务-对象存储OSS **Repository Path**: Spring-Cloud-Examples/spring-cloud-oss ## Basic Information - **Project Name**: 微服务-对象存储OSS - **Description**: 文件下载、文件上传,接第三方OSS - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 7 - **Forks**: 1 - **Created**: 2020-01-07 - **Last Updated**: 2022-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Cloud OSS #### 介绍 基于 `Spring Cloud` 微服务框架开发的文件上传、文件下载服务。 已支持: - 断点下载(仅支持本地文件) - 普通下载模式限制下载速度 - 服务器本地存储文件上传 - 多种OSS存储文件上传(七牛云OSS、阿里云OSS、腾讯云OSS) #### 软件架构 软件架构说明 - `Spring Boot` `2.2.2.RELEASE` - `Spring Cloud` `Hoxton.SR1` - `Spring Cloud OAuth2` - `MyBatis-Plus` `3.3.0` - `MySQL` `8.0` - `Consul` #### 使用说明 ##### 普通下载、断点下载 路径:`city.spring.oss.controller.CustomDownloadController#handleRequest` 该功能实现参考 `org.springframework.web.servlet.resource.ResourceHttpRequestHandler` 来做修改,在 `city.spring.oss.controller.CustomDownloadController#afterPropertiesSet` 中添加服务器本地可下载文件路径配置: ```java @Override public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); List locations = getLocations(); // 把系统文件的 D:/ 和 E:/ 路径加入到可下载的路径列表中 locations.add(new FileSystemResource("D:/")); locations.add(new FileSystemResource("E:/")); } ``` 通过自定义访问接口、自定义下载文件参数来获取文件,而不是默认的直接把URI当做静态文件路径 ```java @RequestMapping("/test/download") @Override public void handleRequest(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response) throws ServletException, IOException { // ... 具体实现 } @Override protected Resource getResource(HttpServletRequest request) throws IOException { // super.getResource(request); 默认的方法是通过URI来获取文件资源的, // 因为自定义下载路径,URI是固定的,需要从请求参数中获取文件资源信息 String filename = request.getParameter("filename"); if (filename == null) { return null; } return pathResourceResolver.resolveResource(request, filename, getLocations(), null); } ``` 下载请求示例: - `/test/download?filename=apply-explain.txt` 以默认的方式打开URL - `/test/download?filename=apply.doc&download` 强制浏览器下载文件 - `/test/download?filename=apply.doc&download=auto` 自动判断是否强制下载(文件大小大于5M强制下载) **如何启用断点下载?** 这个根据浏览器、下载工具来决定的,主要表现为在请求头中是否有 `Range` 参数和相关参数。 以谷歌浏览器为例,谷歌浏览器默认是普通下载,而不是断点下载,即使谷歌浏览器暂停文件下载,浏览器与服务器的连接也是未断开的,依旧保持与服务器连接状态。 常见的迅雷是默认断点下载的,使用断点下载可以启动多线程,同时下载文件中不同部分内容,提高下载速度。 **如何启用限速下载?** 限速下载目前仅支持普通下载方式,暂不支持断点下载方式,即使给断点下载支持限速模式,客户端也可以通过多线程方式来提高下载速度,此时断点下载的限速功能形同虚设。 启用限速下载需要进行如下设置,使用自定义的 `ResourceHttpMessageConverter` 对象来实现限速功能: ```java // city.spring.oss.controller.CustomDownloadController#afterPropertiesSet @Override public void afterPropertiesSet() throws Exception { // 单线程、非断点下载限速控制:1024Kb/s // city.spring.oss.controller.CustomResourceHttpMessageConverter setResourceHttpMessageConverter(new CustomResourceHttpMessageConverter(1024)); super.afterPropertiesSet(); } ``` ##### 文件上传 文件上传功能包含服务器本地存储、七牛云OSS、阿里云OSS、腾讯云OSS。 通过在数据库中存储OSS连接信息,文件上传时指定具体的OSS信息ID来把文件上传到指定的OSS里面。 请求示例: ```bash curl --location --request POST 'http://127.0.0.1:8082/oss/test/upload?oss=2' \ --header 'Content-Type: multipart/form-data; boundary=--------------------------139911904971890003871568' \ --form 'file=@/D:/share/test.csv' ``` 返回示例: ```json { "code": 0, "msg": "上传成功", "files": [ { "status": "ok", "info": { "domainName": "http://download.oss.houkunlin.cn", "key": "2a919e90fb5babeec614dec136bde352a5e555c2", "size": 1156, "submittedFileName": "test.csv", "contentType": "text/csv", "ossProvider": 2, "url": "http://download.oss.houkunlin.cn/2a919e90fb5babeec614dec136bde352a5e555c2" } } ] } ``` 在本示例中上传路径为:`/test/upload` 上传参数 `oss=2` 表示使用数据库中 `ID=2` OSS连接信息来保存上传过来的文件,在测试数据库中该ID对应了七牛云OSS,因此该文件将被上传到七牛云OSS,返回字段 `ossProvider = 2` 表示七牛云类型存储。 #### 参与贡献 1. Fork 本仓库 2. 断点下载建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request