Skip to content

Commit

Permalink
Merge pull request #265 from dromara/dev
Browse files Browse the repository at this point in the history
Release:2.2.0
  • Loading branch information
1171736840 authored Jul 2, 2024
2 parents 7503336 + 84a3d8d commit efe25a3
Show file tree
Hide file tree
Showing 90 changed files with 6,491 additions and 413 deletions.
17 changes: 12 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ Amazon S3、GoogleCloud Storage、FastDFS、 Azure Blob Storage、Cloudflare R2

💡 通过 WebDAV 连接到 Alist 后,可以使用百度网盘、天翼云盘、阿里云盘、迅雷网盘等常见存储服务,查看 [Alist 支持的存储平台](https://alist.nn.ci/zh/guide/webdav.html#webdav-%E5%AD%98%E5%82%A8%E6%94%AF%E6%8C%81)

🚚 支持在不同存储平台之间迁移文件,详情查看 [迁移文件](https://x-file-storage.xuyanwu.cn/#/迁移文件)

GitHub:https://github.com/dromara/x-file-storage
<br />
Gitee:https://gitee.com/dromara/x-file-storage
Expand All @@ -54,6 +56,8 @@ Gitee:https://gitee.com/dromara/x-file-storage

这里是简要的更新记录,查看 [详细的更新记录](https://x-file-storage.xuyanwu.cn/#/更新记录)

`2.2.0` 修复大量问题,新增获取文件、列举文件,重构预签名 URL 支持客户端上传、下载、删除等操作,新增 Solon 插件,优化手动分片上传等功能,详情查看 [更新记录](https://x-file-storage.xuyanwu.cn/#/更新记录?id=_220)
<br />
`2.1.0` 修复大量问题,新增存储平台 FastDFS 和 Azure Blob Storage,新增复制、移动(重命名)文件,手动分片上传(断点续传)和计算哈希等功能,详情查看 [更新记录](https://x-file-storage.xuyanwu.cn/#/更新记录?id=_210)
<br />
`2.0.0` 捐赠至 [dromara](https://dromara.org/zh) 开源社区,更改项目名、包名,优化项目结构、支持 Metadata 元数据等,从旧版升级需要注意,详情查看 [更新记录](https://x-file-storage.xuyanwu.cn/#/更新记录?id=_200)
Expand All @@ -71,11 +75,13 @@ Gitee:https://gitee.com/dromara/x-file-storage
### 📅更新计划

- 接入存储平台:HDFS、火山云 TOS、Samba、NFS
- 用户端直传
- 追加缩略图
- 列出文件
- 文件内容预加载
- 新增 Access 模块,尝试通过 HTTP、FTP、WebDAV 等协议对外提供接口,方便其它程序使用
- 追加文件
- 分片下载
- 直接输出到 HttpServletResponse 的响应流中
- 其它更多功能

-------

Expand All @@ -85,14 +91,14 @@ Gitee:https://gitee.com/dromara/x-file-storage

#### 🔧 配置

这里以阿里云 OSS 为例,`pom.xml` 引入本项目,这里默认是 `SpringBoot` 环境,其它环境参考 [脱离 SpringBoot 单独使用](https://x-file-storage.xuyanwu.cn/#/脱离SpringBoot单独使用)
这里以阿里云 OSS 为例,`pom.xml` 引入本项目,这里默认是 `SpringBoot` 环境,`Solon` 环境参考 [在 Solon 中使用](https://x-file-storage.xuyanwu.cn/#/在Solon中使用)其它环境参考 [脱离 SpringBoot 单独使用](https://x-file-storage.xuyanwu.cn/#/脱离SpringBoot单独使用)

```xml
<!-- 引入本项目 -->
<dependency>
<groupId>org.dromara.x-file-storage</groupId>
<artifactId>x-file-storage-spring</artifactId>
<version>2.1.0</version>
<version>2.2.0</version>
</dependency>
<!-- 引入 阿里云 OSS SDK,如果使用其它存储平台,就引入对应的 SDK -->
<dependency>
Expand Down Expand Up @@ -138,7 +144,7 @@ public class SpringFileStorageTestApplication {
```
#### ✨开始上传

支持 File、MultipartFile、byte[]、InputStream、URL、URI、String、HttpServletRequest,大文件会自动分片上传。如果想支持更多方式,请阅读 [文件适配器](https://x-file-storage.xuyanwu.cn/#/文件适配器) 章节
支持 File、MultipartFile、UploadedFile、byte[]、InputStream、URL、URI、String、HttpServletRequest,大文件会自动分片上传。如果想支持更多方式,请阅读 [文件适配器](https://x-file-storage.xuyanwu.cn/#/文件适配器) 章节

```java
@RestController
Expand All @@ -163,6 +169,7 @@ public class FileDetailController {
public String upload2(MultipartFile file) {
FileInfo fileInfo = fileStorageService.of(file)
.setPath("upload/") //保存到相对路径下,为了方便管理,不需要可以不写
.setSaveFilename("image.jpg") //设置保存的文件名,不需要可以不写,会随机生成
.setObjectId("0") //关联对象id,为了方便管理,不需要可以不写
.setObjectType("0") //关联对象类型,为了方便管理,不需要可以不写
.putAttr("role","admin") //保存一些属性,可以在切面、保存上传记录、自定义存储平台等地方获取使用,不需要可以不写
Expand Down
10 changes: 10 additions & 0 deletions docs/Metadata.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,22 @@ FileInfo fileInfo = fileStorageService.of(file)
.putThUserMetadata("role","777")
.thumbnail()
.upload();

//获取
RemoteFileInfo info = fileStorageService.getFile(fileInfo);
Assert.notNull(info, "文件不存在");
//文件元数据
MapProxy metadata = info.getKebabCaseInsensitiveMetadata();
//文件用户元数据
MapProxy userMetadata = info.getKebabCaseInsensitiveUserMetadata();
```

> [!WARNING|label:重要提示:]
> 每个存储平台支持的 Metadata 有所不同,例如 七牛云 Kodo 和 又拍云 USS 就不支持 `Content-Disposition`,具体支持情况以每个存储平台的官方文档为准
>
> 在传入 UserMetadata 时,不用传入前缀,例如 `x-amz-meta-` `x-qn-meta-` `x-upyun-meta-`,SDK会自动处理
>
> 每个存储平台获取到的 Metadata 都不相同,有些是字符串类型,有些是其它类型的对象,这部分需要自行做好判断

## 处理异常
Expand Down
64 changes: 35 additions & 29 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ Amazon S3、GoogleCloud Storage、FastDFS、 Azure Blob Storage、Cloudflare R2

💡 通过 WebDAV 连接到 Alist 后,可以使用百度网盘、天翼云盘、阿里云盘、迅雷网盘等常见存储服务,查看 [Alist 支持的存储平台](https://alist.nn.ci/zh/guide/webdav.html#webdav-%E5%AD%98%E5%82%A8%E6%94%AF%E6%8C%81)

🚚 支持在不同存储平台之间迁移文件,详情查看 [迁移文件](迁移文件)

GitHub:https://github.com/dromara/x-file-storage
<br />
Gitee:https://gitee.com/dromara/x-file-storage
Expand All @@ -55,6 +57,8 @@ Gitee:https://gitee.com/dromara/x-file-storage

这里是简要的更新记录,查看 [详细的更新记录](更新记录)

`2.2.0` 修复大量问题,新增获取文件、列举文件,重构预签名 URL 支持客户端上传、下载、删除等操作,新增 Solon 插件,优化手动分片上传等功能,详情查看 [更新记录](更新记录?id=_220)
<br />
`2.1.0` 修复大量问题,新增存储平台 FastDFS 和 Azure Blob Storage,新增复制、移动(重命名)文件,手动分片上传(断点续传)和计算哈希等功能,详情查看 [更新记录](更新记录?id=_210)
<br />
`2.0.0` 捐赠至 [dromara](https://dromara.org/zh) 开源社区,更改项目名、包名,优化项目结构、支持 Metadata 元数据等,从旧版升级需要注意,详情查看 [更新记录](更新记录?id=_200)
Expand All @@ -72,11 +76,13 @@ Gitee:https://gitee.com/dromara/x-file-storage
# 📅更新计划

- 接入存储平台:HDFS、火山云 TOS、Samba、NFS
- 用户端直传
- 追加缩略图
- 列出文件
- 文件内容预加载
- 新增 Access 模块,尝试通过 HTTP、FTP、WebDAV 等协议对外提供接口,方便其它程序使用
- 追加文件
- 分片下载
- 直接输出到 HttpServletResponse 的响应流中
- 其它更多功能

-------

Expand All @@ -86,6 +92,32 @@ Gitee:https://gitee.com/dromara/x-file-storage

-------

# 💳捐赠
如果你觉得这个项目不错,可以点个 Star 或捐赠请作者吃包辣条~,不想打赏的话用支付宝扫最后一个码可以领取个红包,在此表示感谢^_^

<img src="https://x-file-storage.xuyanwu.cn/assets/wx.png" style="height: 350px;margin-right: 20px" alt="微信">
<img src="https://x-file-storage.xuyanwu.cn/assets/zfb.jpg" style="height: 350px;margin-right: 20px" alt="支付宝">
<img src="https://x-file-storage.xuyanwu.cn/assets/zfb2.jpg" style="height: 350px" alt="支付宝2">
<img src="https://x-file-storage.xuyanwu.cn/assets/elm.jpg" style="height: 350px;margin-right: 20px" alt="饿了么">
<img src="https://x-file-storage.xuyanwu.cn/assets/mt.jpeg" style="height: 350px" alt="美团外卖">

或者点击以下链接,将页面拉到最下方点击“捐赠”即可

[Gitee上捐赠](https://gitee.com/dromara/x-file-storage)

-------

# 🌶️VIP交流群

扫描上方二维码捐赠 99 元,截图发我 `QQ1171736840` 即可加入 VIP 交流群(超过一年则需要再次捐赠,否则将进行清退)

也可以点击添加免费交流群
<a target="_blank" href='https://jq.qq.com/?_wv=1027&k=eGfeNqka'>
<img src='https://img.shields.io/badge/QQ%E7%BE%A4-515706495-orange' alt='515706495' />
</a> 一起交流

-------

# 🏗️添砖加瓦

## 🎋分支说明
Expand Down Expand Up @@ -134,36 +166,10 @@ X File Storage 感谢各位小伙伴的信任与支持,如果您已经在项
[在 Gitee 上登记](https://gitee.com/dromara/x-file-storage/issues/I83Q6R)<br/>
[在 GitHub 上登记](https://github.com/dromara/x-file-storage/issues/114)

[tg.md](https://x-file-storage.xuyanwu.cn/assets/link/member-project.md ':include')

-------

# 🌏知识星球

<img src="https://x-file-storage.xuyanwu.cn/assets/zsxq.png" height="200px" alt="知识星球">

-------

# 💳捐赠
如果你觉得这个项目不错,可以点个 Star 或捐赠请作者吃包辣条~,不想打赏的话用支付宝扫最后一个码可以领取个红包,在此表示感谢^_^

<img src="https://x-file-storage.xuyanwu.cn/assets/wx.png" style="height: 350px;margin-right: 20px" alt="微信">
<img src="https://x-file-storage.xuyanwu.cn/assets/zfb.jpg" style="height: 350px;margin-right: 20px" alt="支付宝">
<img src="https://x-file-storage.xuyanwu.cn/assets/zfb2.jpg" style="height: 350px;margin-right: 20px" alt="支付宝2">
<img src="https://x-file-storage.xuyanwu.cn/assets/elm.jpg" style="height: 350px;margin-right: 20px" alt="饿了么">
<img src="https://x-file-storage.xuyanwu.cn/assets/mt.jpeg" style="height: 350px" alt="美团外卖">

或者点击以下链接,将页面拉到最下方点击“捐赠”即可

[Gitee上捐赠](https://gitee.com/dromara/x-file-storage)

-------

# 🌶️VIP交流群

扫描上方二维码捐赠 99 元,截图发我 `QQ1171736840` 即可加入 VIP 交流群(超过一年则需要再次捐赠,否则将进行清退)

也可以点击添加免费交流群
<a target="_blank" href='https://jq.qq.com/?_wv=1027&k=eGfeNqka'>
<img src='https://img.shields.io/badge/QQ%E7%BE%A4-515706495-orange' alt='515706495' />
</a> 一起交流
[member-project.md](https://x-file-storage.xuyanwu.cn/assets/link/member-project.md ':include')
3 changes: 2 additions & 1 deletion docs/_navbar.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
* 🌟文档版本 2.1.0
* 🌟文档版本 2.2.0

* [2.2.0](https://x-file-storage.xuyanwu.cn/2.2.0/)
* [2.1.0](https://x-file-storage.xuyanwu.cn/2.1.0/)
* [2.0.0](https://x-file-storage.xuyanwu.cn/2.0.0/)
* [1.0.3](https://x-file-storage.xuyanwu.cn/1.0.3/)
Expand Down
4 changes: 3 additions & 1 deletion docs/_sidebar.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
* [📚简介](/ "简介")
* [🍭快速入门](快速入门 "快速入门")
* [🍬基础功能](基础功能 "基础功能")
* [🚚迁移文件](迁移文件 "迁移文件")
* [🍉ACL 访问控制列表](acl "ACL 访问控制列表")
* [🥑预签名 URL](预签名URL "签名 URL")
* [🥑预签名 URL](预签名URL "预签名 URL")
* [🌼Metadata 元数据](Metadata "Metadata 元数据")
* [🥦存储平台](存储平台 "存储平台")
* [🌽文件适配器](文件适配器 "文件适配器")
* [🔍️识别文件的 MIME 类型](识别文件的MIME类型 "识别文件的 MIME 类型")
* [🍵️计算哈希](hash "hash")
* [🧪切面](切面 "切面")
* [🌱脱离 SpringBoot 单独使用](脱离SpringBoot单独使用 "脱离 SpringBoot 单独使用")
* [🍩在 Solon 中使用](在Solon中使用 "在 Solon 中使用")
* [🙋‍♂️常见问题](常见问题 "常见问题")
* [📜更新记录](更新记录 "更新记录")
1 change: 1 addition & 0 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<link rel="icon" href="https://x-file-storage.xuyanwu.cn//assets/logo4.png" type="image/x-icon"/>
<link rel="stylesheet" href="https://x-file-storage.xuyanwu.cn/assets/docsify-theme-vue.css">
<link rel="stylesheet" href="https://x-file-storage.xuyanwu.cn/assets/nav.css">
<style>
#main {
max-width: 90%;
Expand Down
66 changes: 66 additions & 0 deletions docs/在Solon中使用.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# 在 Solon 中使用

> Solon 官网 https://solon.noear.org/
`2.2.0` 版本开始原生支持在 `Solon` 中使用,之前的版本可以参考 [脱离 SpringBoot 单独使用](脱离SpringBoot单独使用)

先引入本项目, 注意这里是 `x-file-storage-solon`,而不是 `x-file-storage-core`,之后再参考 [快速入门](快速入门) 引入对应平台的依赖

```xml
<dependency>
<groupId>org.dromara.x-file-storage</groupId>
<artifactId>x-file-storage-solon</artifactId>
<version>2.2.0</version>
</dependency>
```

如果使用本地存储, 请务必添加 `solon.web.staticfiles` 依赖
```xml
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon.web.staticfiles</artifactId>
<version>2.7.1</version><!-- 当前行可去掉, 跟随 solon 的版本管理 -->
</dependency>
```


默认情况下,Solon 会自动装配 `SolonFileStorageProperties` , 文件配置完全等同于使用 Spring 的情况, 可以在 `app.yml` 中按照 Spring 配置文件的格式进行配置。
如:
```yaml
dromara:
x-file-storage: #文件存储配置
default-platform: minio-user #默认使用的存储平台
thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】
enable-multipart-file-wrapper: true #是否启用多文件包装器
local-plus:
- platform: local-plus-1 # 存储平台标识
enable-storage: true #启用存储
enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高)
domain: http://127.0.0.1:8080/file/ # 访问域名,例如:“http://127.0.0.1:8030/file/”,注意后面要和 path-patterns 保持一致,“/”结尾,本地存储建议使用相对路径,方便后期更换域名
base-path: local-plus/ # 基础路径
path-patterns: /file/ # 访问路径
storage-path: D:/temp/ # 存储路径
minio:
- platform: minio-user # 存储平台标识
enable-storage: true # 启用存储
access-key: j9rMyECcmNH0lNBqPfOo
secret-key: 0NYFJSl4D8msuxHirenthXA4lvju4c3QNdmQ29Ob
end-point: http://127.0.0.1:9000
bucket-name: user
# domain: ?? # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
base-path: user/ # 基础路径
- platform: minio-dept # 存储平台标识
enable-storage: true # 启用存储
access-key: j9rMyECcmNH0lNBqPfOo
secret-key: 0NYFJSl4D8msuxHirenthXA4lvju4c3QNdmQ29Ob
end-point: http://127.0.0.1:9000
bucket-name: dept
# domain: ?? # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
base-path: dept/ # 基础路径
```
同时, 由于 Solon 和 Spring 环境不一致, 部分功能使用会有差异, 详情参见 [Solon 与 Spring Boot 的区别](https://solon.noear.org/article/compare-springboot)
在注入 `fileStorageService` 后, 可以使用 `fileStorageService` 进行文件操作, 例如上传、下载、删除等。完全等同 Spring 的使用方式。


64 changes: 63 additions & 1 deletion docs/基础功能.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

### 基本的上传方式

`of`方法支持 File、MultipartFile、byte[]、InputStream、URL、URI、String、HttpServletRequest,大文件会自动分片上传。如果想支持更多方式,请阅读 [文件适配器](文件适配器) 章节
`of`方法支持 File、MultipartFile、UploadedFile、byte[]、InputStream、URL、URI、String、HttpServletRequest,大文件会自动分片上传。如果想支持更多方式,请阅读 [文件适配器](文件适配器) 章节

```java
// 直接上传
Expand Down Expand Up @@ -223,6 +223,10 @@ fileStorageService.abortMultipartUpload(fileInfo).abort();
> 2. 建议将 FileInfo 保存到数据库中,这样就可以使用 `fileStorageService.getFileInfoByUrl("https://abc.def.com/xxx.png")` 来获取 FileInfo 方便操作,详情请阅读 [保存上传记录](基础功能?id=保存上传记录) 章节
> 3. 手动分片上传暂时无法生成缩略图,将在后续版本提供追加缩略图功能。
### 客户端上传

通过预签名 URL 的方式可以实现客户端上传,详情查看 [预签名 URL 上传](预签名URL?id=上传)


### 监听上传进度

Expand Down Expand Up @@ -526,6 +530,64 @@ CREATE TABLE `file_part_detail`

<!-- fold:end -->

## 获取文件

```java
//通过 FileInfo 获取文件信息
RemoteFileInfo info = fileStorageService.getFile(fileInfo);
//通过 FileInfo 获取缩略图文件信息
RemoteFileInfo info2 = fileStorageService.getThFile(fileInfo);

//将结果转成 FileInfo 方便进行其它操作
FileInfo fileInfo2 = info.toFileInfo();
//将缩略图文件信息也 set 到 FileInfo 中
info2.toFileInfoTh(fileInfo2);

//自行传入 path 及 filename 获取文件信息
RemoteFileInfo info3 = fileStorageService.getFile().setPath("test/").setFilename("123.jpg").getFile();
Assert.notNull(info3, "文件不存在");
log.info("获取文件结果:{}", info3);
//文件元数据
MapProxy metadata = info3.getKebabCaseInsensitiveMetadata();
//文件用户元数据
MapProxy userMetadata = info3.getKebabCaseInsensitiveUserMetadata();

//获取原始文件信息,这里以阿里云为例
OSSObject ossObject = info3.getOriginalAliyunOssObject();
```

> [!WARNING|label:重要提示:]
> 将 RemoteFileInfo 转为 FileInfo 时,有以下几点需要注意:
> 1. 一般情况下 FileInfo 中的 createTime(创建时间)就是 RemoteFileInfo 中的 lastModified(最后修改时间),如果有误,可以自行设置
> 2. RemoteFileInfo 中的 metadata 元数据值为 Object 类型,FileInfo 中的元数据值为 String 类型,目前是将 Object 类型使用 toString() 方法转为 String 类型,应该可以满足大部分情况,如有需要可以自行转换
## 列举文件

```java
//是否支持列举文件
ListFilesSupportInfo isSupportListFiles = fileStorageService.isSupportListFiles();

//列举文件及目录
ListFilesResult result = fileStorageService.listFiles().setPath("test/").listFiles();
result.getDirList().forEach(info -> log.info("目录:{}", info));
log.info("列举目录完成,共 {} 个目录", result.getDirList().size());
result.getFileList().forEach(info -> log.info("文件:{}", info));
log.info("列举文件完成,共 {} 个文件", result.getFileList().size());
log.info("列举文件全部结果:{}", result);

//列表是否被截断,就是当前目录下还有其它文件或目录超出最大数量未被列举
log.info("列表是否被截断:{}", result.getIsTruncated());
log.info("下次列举的起始位置:{}", result.getNextMarker());

//其它更多参数
ListFilesResult result2 = fileStorageService.listFiles()
.setPath("test/") // 指定目录
.setMaxFiles(10) //要列举的最大文件及目录数量
.setFilenamePrefix("abc") // 文件名前缀
.setMarker("123456") //列举的起始位置,从上一次列举结果中获取
.listFiles();
```

## 下载

### 多种下载方式
Expand Down
Loading

0 comments on commit efe25a3

Please sign in to comment.