前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一行代码将文件存储到本地或各种存储平台

一行代码将文件存储到本地或各种存储平台

原创
作者头像
用户10143704
发布于 2024-05-03 13:41:53
发布于 2024-05-03 13:41:53
27400
代码可运行
举报
运行总次数:0
代码可运行

一行代码将文件存储到本地或各种存储平台

这里我们介绍的是一个开源项目。

这个是他的官网

简介 (xuyanwu.cn)

下面来看他的一个介绍:

一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS、七牛云 Kodo、腾讯云 COS、百度云 BOS、又拍云 USS、MinIO、 Amazon S3、GoogleCloud Storage、FastDFS、 Azure Blob Storage、Cloudflare R2、金山云 KS3、美团云 MSS、京东云 OSS、天翼云 OOS、移动 云EOS、沃云 OSS、 网易数帆 NOS、Ucloud US3、青云 QingStor、平安云 OBS、首云 OSS、IBM COS、其它兼容 S3 协议的存储平台

下面就开始了解一下这个项目,以及快速入门

快速入门

上传文件

首先我们需要引入pom文件,需要注意的是他是依赖于springboot的环境的

i如果你不是springboot的环境的话

脱离 SpringBoot 单独使用 (xuyanwu.cn)

可以参考这个文章,我这里就不做讲解了。

ps:这里考虑到springboot最大单文件上传是1MB所以需要我们首先配置一下

代码语言:javascript
代码运行次数:0
运行
复制
spring:
  servlet:
    multipart:
      max-file-size: 10MB # 文件大小限制
      max-request-size: 100MB # 请求大小限制

首先引入pom文件

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
    <groupId>org.dromara.x-file-storage</groupId>
    <artifactId>x-file-storage-spring</artifactId>
    <version>2.1.0</version>
</dependency>

我们首先快速入门就直接用本地来举例。

之后我们来写配置文件

首先是一个基础的配置:

代码语言:javascript
代码运行次数:0
运行
复制
dromara:
  x-file-storage: #文件存储配置
    default-platform: local-plus-1 #默认使用的存储平台 这里和下面的platform是一样的
    thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】
    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/ # 存储路径

这个local-plus就是本地的,如果你用别的平台可以去配置别的平台的。

可以参考官网的这里、

快速入门 (xuyanwu.cn)

image-20240503211345923
image-20240503211345923

之后我们在启动类上加上@EnableFileStorage注解

之后就可以开始使用了

要想使用就要去注入对应的service

代码语言:javascript
代码运行次数:0
运行
复制
@Autowired
private FileStorageService fileStorageService;//注入实列

首先看一个最简单的上传文件

代码语言:javascript
代码运行次数:0
运行
复制
    /**
     * 上传文件
     */
    @PostMapping("/upload")
    public FileInfo upload(MultipartFile file) {
        return fileStorageService.of(file).upload();
    }

之后我们来做一个测试

image-20240503204932864
image-20240503204932864

同时我们也可以看到在本地是有了:

image-20240503204954062
image-20240503204954062

并且打开这个url也是没问题的。

如果你不想要这么多的信息。

也可以只返回一个url

只需要在那个之后加一个getUrl()就可以获得。

fileStorageService.of返回的是一个FileInfo对象,这个对象就是我们刚才测试看到的内容。我们可以通过链式编程获得里面的东西。

同时也可以在上传前设置很多的参数

我们可以通过这个源码来看到

image-20240503205602941
image-20240503205602941

有兴趣的也可以去官网去了解。

这里用的比较多的可能是,setPlatform

这个是用来设置一个上传平台的。可以用作一个备用上传的接口

我们之后来看上传图片

上传图片

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 上传图片,成功返回文件信息
 * 图片处理使用的是 https://github.com/coobird/thumbnailator
 */
@PostMapping("/upload-image")
public FileInfo uploadImage(MultipartFile file) {
    return fileStorageService.of(file)
            .image(img -> img.size(1000,1000))  //将图片大小调整到 1000*1000
            .thumbnail(th -> th.size(200,200))  //再生成一张 200*200 的缩略图
            .upload();
}
image-20240503210836629
image-20240503210836629

他会返回图片地址以及一个锁视图。

进阶操作

下面讲解一下进阶操作

直接上传 HttpServletRequest

这种方式通过直接读取输入流进行上传,可以实现文件不落盘,边读取边上传,速度更快

需要先在配置文件中开启 multipart 懒加载,不然在 Controller 中拿到输入流是已经被读取过的

代码语言:javascript
代码运行次数:0
运行
复制
spring:
  servlet:
    multipart:
      max-file-size: 10MB # 文件大小限制
      max-request-size: 100MB # 请求大小限制
      resolve-lazily: true
代码语言:javascript
代码运行次数:0
运行
复制
    /**
     * 直接读取 HttpServletRequest 中的文件进行上传,成功返回文件信息
     */
    @PostMapping("/upload-request")
    public FileInfo uploadRequest(HttpServletRequest request) {
        return fileStorageService.of(request).upload();
    }

保存上传记录

可以实现 FileRecorder 这个接口,把文件信息保存到数据库中。

首先我们要创建一个对应的表。

这个是官方推荐的一个sql表:

代码语言:javascript
代码运行次数:0
运行
复制
-- 这里使用的是 mysql
CREATE TABLE `file_detail`
(
    `id`                varchar(32)  NOT NULL COMMENT '文件id',
    `url`               varchar(512) NOT NULL COMMENT '文件访问地址',
    `size`              bigint(20)   DEFAULT NULL COMMENT '文件大小,单位字节',
    `filename`          varchar(256) DEFAULT NULL COMMENT '文件名称',
    `original_filename` varchar(256) DEFAULT NULL COMMENT '原始文件名',
    `base_path`         varchar(256) DEFAULT NULL COMMENT '基础存储路径',
    `path`              varchar(256) DEFAULT NULL COMMENT '存储路径',
    `ext`               varchar(32)  DEFAULT NULL COMMENT '文件扩展名',
    `content_type`      varchar(128) DEFAULT NULL COMMENT 'MIME类型',
    `platform`          varchar(32)  DEFAULT NULL COMMENT '存储平台',
    `th_url`            varchar(512) DEFAULT NULL COMMENT '缩略图访问路径',
    `th_filename`       varchar(256) DEFAULT NULL COMMENT '缩略图名称',
    `th_size`           bigint(20)   DEFAULT NULL COMMENT '缩略图大小,单位字节',
    `th_content_type`   varchar(128) DEFAULT NULL COMMENT '缩略图MIME类型',
    `object_id`         varchar(32)  DEFAULT NULL COMMENT '文件所属对象id',
    `object_type`       varchar(32)  DEFAULT NULL COMMENT '文件所属对象类型,例如用户头像,评价图片',
    `metadata`          text COMMENT '文件元数据',
    `user_metadata`     text COMMENT '文件用户元数据',
    `th_metadata`       text COMMENT '缩略图元数据',
    `th_user_metadata`  text COMMENT '缩略图用户元数据',
    `attr`              text COMMENT '附加属性',
    `file_acl`          varchar(32)  DEFAULT NULL COMMENT '文件ACL',
    `th_file_acl`       varchar(32)  DEFAULT NULL COMMENT '缩略图文件ACL',
    `hash_info`         text COMMENT '哈希信息',
    `upload_id`         varchar(128) DEFAULT NULL COMMENT '上传ID,仅在手动分片上传时使用',
    `upload_status`     int(11)      DEFAULT NULL COMMENT '上传状态,仅在手动分片上传时使用,1:初始化完成,2:上传完成',
    `create_time`       datetime     DEFAULT NULL COMMENT '创建时间',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB DEFAULT CHARSET = utf8 ROW_FORMAT = DYNAMIC COMMENT ='文件记录表';CREATE TABLE `file_part_detail`
(
    `id`          varchar(32) NOT NULL COMMENT '分片id',
    `platform`    varchar(32)  DEFAULT NULL COMMENT '存储平台',
    `upload_id`   varchar(128) DEFAULT NULL COMMENT '上传ID,仅在手动分片上传时使用',
    `e_tag`       varchar(255) DEFAULT NULL COMMENT '分片 ETag',
    `part_number` int(11)      DEFAULT NULL COMMENT '分片号。每一个上传的分片都有一个分片号,一般情况下取值范围是1~10000',
    `part_size`   bigint(20)   DEFAULT NULL COMMENT '文件大小,单位字节',
    `hash_info`   text CHARACTER SET utf8 COMMENT '哈希信息',
    `create_time` datetime     DEFAULT NULL COMMENT '创建时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8 COMMENT ='文件分片信息表,仅在手动分片上传时使用';

之后我们创建实体类和mapper

这个我就不写了。最后我会提供源码,源码里面是有的。

之后来看save保存

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 保存文件信息到数据库
 */
@SneakyThrows
@Override
public boolean save(FileInfo info) {
    FileDetail detail = toFileDetail(info);
    boolean b = save(detail);
    if (b) {
        info.setId(detail.getId());
    }
    return b;
}

tofiledetail是将 FileInfo 转为 FileDetail

以及

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 根据 url 查询文件信息
 */
@SneakyThrows
@Override
public FileInfo getByUrl(String url) {
    return toFileInfo(getOne(new QueryWrapper<FileDetail>().eq(FileDetail.COL_URL, url)));
}/**
 * 根据 url 删除文件信息
 */
@Override
public boolean delete(String url) {
    remove(new QueryWrapper<FileDetail>().eq(FileDetail.COL_URL, url));
    return true;
}

下载

这个直接看官方写的这几个方法就可以

代码语言:javascript
代码运行次数:0
运行
复制
// 获取文件信息
FileInfo fileInfo = fileStorageService.getFileInfoByUrl("https://file.abc.com/test/a.jpg");// 下载为字节数组
byte[] bytes = fileStorageService.download(fileInfo).bytes();// 下载到文件
fileStorageService.download(fileInfo).file("C:\\a.jpg");// 下载到 OutputStream 中
ByteArrayOutputStream out = new ByteArrayOutputStream();
fileStorageService.download(fileInfo).outputStream(out);// 获取 InputStream 手动处理
fileStorageService.download(fileInfo).inputStream(in -> {
    //TODO 读取 InputStream
});// 直接通过文件信息中的 url 下载,省去手动查询文件信息记录的过程
fileStorageService.download("https://file.abc.com/test/a.jpg").file("C:\\a.jpg");// 下载缩略图
fileStorageService.downloadTh(fileInfo).file("C:\\th.jpg");

删除

代码语言:javascript
代码运行次数:0
运行
复制
//获取文件信息
FileInfo fileInfo = fileStorageService.getFileInfoByUrl("https://file.abc.com/test/a.jpg");//直接删除
fileStorageService.delete(fileInfo);//条件删除
fileStorageService.delete(fileInfo,info -> {
    //TODO 检查是否满足删除条件
    return true;
});//直接通过文件信息中的 url 删除,省去手动查询文件信息记录的过程
fileStorageService.delete("https://file.abc.com/test/a.jpg");

总结

这些就基本上是一个简单的入门了。

如果有更多的操作,可以移入官网了解。

这里的源码在这里:

xiaou61/xiaou-easy-code: 前后端通用解决方案 springboot vue react 原生js (github.com)

在1文件夹里面。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
如何重现 DeepSeek 推理性能突破
DeepSeek-V3 在多个评测中展现出强大性能,成为当前最受关注的开源大模型之一。由于采用了大规模 MoE 架构,如何优化推理性能,是工程落地上的关键难点。DeepSeek 团队于 2 月相继开源了 DeepEP、DeepGEMM、FlashMLA、EPLB 等关键组件。在开源社区工作的基础上,我们在 RTP-LLM 上完成了优化工作,对齐了 DeepSeek 推理系统的性能。
深度学习与Python
2025/05/21
580
如何重现 DeepSeek 推理性能突破
Deepseek-V2技术报告解读!全网最细!
深度求索Deepseek近日发布了v2版本的模型,沿袭了1月发布的 Deepseek-MoE(混合专家模型)的技术路线,采用大量的小参数专家进行建模,同时在训练和推理上加入了更多的优化。沿袭了一贯的作风,Deepseek对模型(基座和对话对齐版本)进行了完全的mit协议开源,可以商用。对于算力不是那么充足的开发者,官方提供了API调用的方案,费用更是达到了全场最低!
zenRRan
2025/02/03
1.2K0
Deepseek-V2技术报告解读!全网最细!
PPT汇总:DeepSeek核心技术前世今生
因为本文是小白方式,尽可能讲解思路为主,所以技术上涉及到的公式部分不会细讲哦。公式部分如有时间会单开文章细细讲解。
腾讯云开发者
2025/03/06
5400
PPT汇总:DeepSeek核心技术前世今生
万字长文详解DeepSeek核心技术
在今年的春节期间,DeepSeek 火出了圈。凭借 DeepSeek-V3 与 DeepSeek-R1 的创新技术和卓越表现,DeepSeek 迅速成为了行业内外的焦点。不管是技术专家还是普通用户,都对 DeepSeek 赞不绝口。我们特别准备了这篇技术科普文章,期望无论你是不是技术同学,都能够读懂 DeepSeek。
腾讯云开发者
2025/02/18
1.9K0
万字长文详解DeepSeek核心技术
如何看待 DeepSeek 发布的 MoE 大模型 DeepSeek-V2?(从推理角度分析)
来源丨https://www.zhihu.com/question/655172528/answer/3491439374
BBuf
2025/02/03
2280
如何看待 DeepSeek 发布的 MoE 大模型 DeepSeek-V2?(从推理角度分析)
大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)
这里提一下,我维护的几个记录个人学习笔记以及社区中其它大佬们的优秀博客链接的仓库都获得了不少star,感谢读者们的认可,我也会继续在开源社区多做贡献。github主页:https://github.com/BBuf ,欢迎来踩
BBuf
2024/06/18
2.8K0
大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)
DeepSeek一天能赚多少钱?官方突然揭秘V3/R1推理系统,成本全透明
就在所有人以为 DeepSeek 预告的 5 天开源告一段落时,今天中午 12 点 11 分,官方 𝕏 帐号再次更新,宣告「开源周」还在继续。不过这第六天 DeepSeek 并没有开源新的软件库,而是介绍了 DeepSeek-V3/R1 的推理系统。
机器之心
2025/03/03
810
DeepSeek一天能赚多少钱?官方突然揭秘V3/R1推理系统,成本全透明
深度解析为什么Deepseek v3的成本这么低
这个问题其实可以从它发布的技术报告中窥见一二。 DeepSeek V3的训练总共才用了不到280万个GPU小时,而Llama 3 405B却用了3080万GP
算法一只狗
2025/01/05
4.1K0
深度解析为什么Deepseek v3的成本这么低
源2.0-M32大模型发布,MoE全新门控网络Attention Router值得关注
近期,一个新的MoE大模型“源2.0-M32”发布,它创新性地提出和采用了“基于注意力机制的门控网络”技术,构建包含32个专家(Expert)的混合专家模型(MoE),大幅提升了模型算力效率。
公众号-arXiv每日学术速递
2024/05/31
3790
源2.0-M32大模型发布,MoE全新门控网络Attention Router值得关注
AI智能体研发之路-模型篇(二):DeepSeek-V2-Chat 训练与推理实战
5月6日私募基金幻方发布DeepSeek-V2,千亿级模型,每百万Tokens仅需1元-2元。5月15日,字节发布白菜价的豆包大模型,5月21日阿里、百度相机大幅下调甚至免费开放自家商用模型接口,大模型价格战正式打响。而被誉为大模型价格屠夫的“DeepSeek-V2”到底是怎么个事儿,是否可以进行训练和推理,今天我们来展开讲一讲。
LDG_AGI
2024/08/13
1.5K0
AI智能体研发之路-模型篇(二):DeepSeek-V2-Chat 训练与推理实战
马斯克烧60亿美元难题,国内大厂有解?开源MoE模算效率黑马登场,3.7B参数单挑Llama 3-70B
最近马斯克就公开表示,因为苦于买不到足够的芯片,xAI只能推迟Gork 2的训练和发布。
新智元
2024/06/05
1060
马斯克烧60亿美元难题,国内大厂有解?开源MoE模算效率黑马登场,3.7B参数单挑Llama 3-70B
DeepSeek V3把训练大模型的成本给干下来了
一夜之间,DeepSeek突然之间炸场,各个大佬都在纷纷转发,而且发布即开源,直接用50多页的论文公布了其训练细节
算法一只狗
2024/12/29
4.9K0
DeepSeek V3把训练大模型的成本给干下来了
单个4090可推理,2000亿稀疏大模型「天工MoE」开源
在大模型浪潮中,训练和部署最先进的密集 LLM 在计算需求和相关成本上带来了巨大挑战,尤其是在数百亿或数千亿参数的规模上。为了应对这些挑战,稀疏模型,如专家混合模型(MoE),已经变得越来越重要。这些模型通过将计算分配给各种专门的子模型或「专家」,提供了一种经济上更可行的替代方案,有可能以极低的资源需求达到甚至超过密集型模型的性能。
机器之心
2024/06/04
6220
单个4090可推理,2000亿稀疏大模型「天工MoE」开源
万字长文解构DeepSeek V1/V2/V3/R1进化史:从算法革命到推理涌现!
在今年的春节期间,DeepSeek 火出了圈。凭借 DeepSeek-V3 与 DeepSeek-R1 的创新技术和卓越表现,DeepSeek 迅速成为了行业内外的焦点。不管是技术专家还是普通用户,都对 DeepSeek 赞不绝口。我们特别准备了这篇技术科普文章,期望无论你是不是技术同学,都能够读懂 DeepSeek。
腾讯云开发者
2025/02/27
7960
万字长文解构DeepSeek V1/V2/V3/R1进化史:从算法革命到推理涌现!
MoE 高效训练的 A/B 面:与魔鬼做交易,用「显存」换「性能」
MoE(Mixture of Experts),又称「混合专家」,本质是一种模块化的稀疏激活。怎么理解?
AI科技评论
2024/06/03
9430
MoE 高效训练的 A/B 面:与魔鬼做交易,用「显存」换「性能」
[DeepSeek]-DeepSeek技术解析:MoE架构实现与代码实战
以下是一篇结合DeepSeek技术解析与代码示例的技术文章,重点展示其核心算法实现与落地应用:
远方2.0
2025/03/15
4310
[DeepSeek]-DeepSeek技术解析:MoE架构实现与代码实战
深度求索开源国内首个 MoE 大模型 | DeepSeekMoE:在专家混合语言模型中实现终极专家专业化
在大语言模型时代,混合专家模型(MoE)是一种很有前途的架构,用于在扩展模型参数时管理计算成本。然而,传统的 MoE 架构(如 GShard)会激活 N 位专家中的 top-K 专家,但在确保专家专业化(即每位专家获取的知识不重叠且重点突出)方面面临挑战。作为回应,研究者提出了 DeepSeekMoE 架构,以实现终极的专家专业化。它涉及两个主要战略:
叶庭云
2024/05/25
1.9K0
深度求索开源国内首个 MoE 大模型 | DeepSeekMoE:在专家混合语言模型中实现终极专家专业化
DeepSeek开源周Day1:重磅发布FlashMLA,重新定义AI推理效率天花板
DeepSeek开源周Day1:重磅发布FlashMLA,重新定义AI推理效率天花板
没事学点编程小知识
2025/02/24
1380
[DeepSeek]解析DeepSeek的技术内核:混合专家架构如何重塑AI效能
在当今大型语言模型(LLM)竞争激烈的赛道上,中国AI企业DeepSeek凭借其独特的技术路线脱颖而出。其核心优势之一,便是对混合专家(Mixture of Experts,简称MoE)架构的创新应用,这一技术选择不仅重塑了AI模型的效能表现,更为行业带来了全新的思考方向。本文将深入解析DeepSeek如何通过MoE架构实现算力与性能的最优平衡。
远方2.0
2025/03/27
1650
[DeepSeek]解析DeepSeek的技术内核:混合专家架构如何重塑AI效能
深度解析DeepSeek核心机制:从模型架构到应用场景
随着大规模语言模型(LLM)的崛起,DeepSeek作为一款具备卓越性能的AI模型,在代码生成、文本理解、对话交互等多个领域展现了强大能力。本文将深入解析DeepSeek的核心机制,包括其模型架构、训练策略、推理优化及其在实际应用中的表现,并通过代码示例展示其强大之处。
江南清风起
2025/03/14
4680
深度解析DeepSeek核心机制:从模型架构到应用场景
推荐阅读
如何重现 DeepSeek 推理性能突破
580
Deepseek-V2技术报告解读!全网最细!
1.2K0
PPT汇总:DeepSeek核心技术前世今生
5400
万字长文详解DeepSeek核心技术
1.9K0
如何看待 DeepSeek 发布的 MoE 大模型 DeepSeek-V2?(从推理角度分析)
2280
大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)
2.8K0
DeepSeek一天能赚多少钱?官方突然揭秘V3/R1推理系统,成本全透明
810
深度解析为什么Deepseek v3的成本这么低
4.1K0
源2.0-M32大模型发布,MoE全新门控网络Attention Router值得关注
3790
AI智能体研发之路-模型篇(二):DeepSeek-V2-Chat 训练与推理实战
1.5K0
马斯克烧60亿美元难题,国内大厂有解?开源MoE模算效率黑马登场,3.7B参数单挑Llama 3-70B
1060
DeepSeek V3把训练大模型的成本给干下来了
4.9K0
单个4090可推理,2000亿稀疏大模型「天工MoE」开源
6220
万字长文解构DeepSeek V1/V2/V3/R1进化史:从算法革命到推理涌现!
7960
MoE 高效训练的 A/B 面:与魔鬼做交易,用「显存」换「性能」
9430
[DeepSeek]-DeepSeek技术解析:MoE架构实现与代码实战
4310
深度求索开源国内首个 MoE 大模型 | DeepSeekMoE:在专家混合语言模型中实现终极专家专业化
1.9K0
DeepSeek开源周Day1:重磅发布FlashMLA,重新定义AI推理效率天花板
1380
[DeepSeek]解析DeepSeek的技术内核:混合专家架构如何重塑AI效能
1650
深度解析DeepSeek核心机制:从模型架构到应用场景
4680
相关推荐
如何重现 DeepSeek 推理性能突破
更多 >
目录
  • 一行代码将文件存储到本地或各种存储平台
  • 快速入门
    • 上传文件
    • 上传图片
  • 进阶操作
    • 直接上传 HttpServletRequest
    • 保存上传记录
    • 下载
    • 删除
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档