还在手动封装文件上传?快来试试这款一行代码实现多平台文件存储的工具!

这篇具有很好参考价值的文章主要介绍了还在手动封装文件上传?快来试试这款一行代码实现多平台文件存储的工具!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,我是 Java陈序员

文件上传下载,是我们在开发中经常会遇到的需求!

无论是本地存储、还是云存储,我们可以自己封装 API 来实现功能。

今天,给大家介绍一款一行代码实现多平台文件存储的工具,开箱即用!

关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。

项目介绍

x-file-storage —— 一行代码实现将文件存储到本地、FTP、SFTP、WebDAV、OSS 云存储、其它兼容 S3 协议的存储平台。

支持的存储平台:

支持的对象存储:

快速入门

配置

1、引入项目依赖

<dependency>
    <groupId>org.dromara.x-file-storage</groupId>
    <artifactId>x-file-storage-spring</artifactId>
    <version>2.0.0</version>
</dependency>

默认是 SpringBoot 环境,如不是 SpringBoot 环境可使用如下方式初始化。

//配置文件定义存储平台
FileStorageProperties properties = new FileStorageProperties();
properties.setDefaultPlatform("ftp-1");
FtpConfig ftp = new FtpConfig();
ftp.setPlatform("ftp-1");
ftp.setHost("192.168.3.100");
ftp.setPort(2121);
ftp.setUser("root");
ftp.setPassword("123456");
ftp.setDomain("ftp://192.168.3.100:2121/");
ftp.setBasePath("ftp/");
ftp.setStoragePath("/");
properties.setFtp(Collections.singletonList(ftp));

//创建,自定义存储平台、 Client 工厂、切面等功能都有对应的添加方法
FileStorageService service = FileStorageServiceBuilder.create(properties).useDefault().build();

//初始化完毕,开始上传吧
FileInfo fileInfo = service.of(new File("D:\\Desktop\\a.png")).upload();

2、引入对应平台的依赖,如使用阿里云OSS,引入阿里云OSS的依赖,依此类推

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.16.1</version>
</dependency>

3、配置文件中添加配置

dromara:
  x-file-storage: #文件存储配置
    default-platform: huawei-obs-1 #默认使用的存储平台
    thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】
    aliyun-oss:
      - platform: aliyun-oss-1 # 存储平台标识
        enable-storage: true  # 启用存储
        access-key: ??
        secret-key: ??
        end-point: ??
        bucket-name: ??
        domain: ?? # 访问域名,注意“/”结尾,例如:https://abc.oss-cn-shanghai.aliyuncs.com/
        base-path: test/ # 基础路径

tips:其他云平台的配置可参考官方文档:https://x-file-storage.xuyanwu.cn/#/

编码

1、在启动类上加上 @EnableFileStorage 注解

@EnableFileStorage
@SpringBootApplication
public class SpringFileStorageTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringFileStorageTestApplication.class,args);
    }
}

2、上传文件

// 注入实列
@Autowired
private FileStorageService fileStorageService;

/**
 * 上传文件
 */
@PostMapping("/upload")
public FileInfo upload(MultipartFile file) {
    return fileStorageService.of(file).upload();
}

完整功能

上传文件

直接上传

fileStorageService.of(file).upload();

文件流上传

fileStorageService.of(inputStream).setOriginalFilename("a.jpg").upload();

上传到指定路径下

fileStorageService.of(file)
        .setPath("upload/") // 保存到相对路径下,为了方便管理,不需要可以不写
        .upload();

关联文件参数并上传

fileStorageService.of(file)
        .setObjectId("0")   // 关联对象id,为了方便管理,不需要可以不写
        .setObjectType("0") // 关联对象类型,为了方便管理,不需要可以不写
        .putAttr("role","admin") //保存一些属性,可以在切面、保存上传记录、自定义存储平台等地方获取使用,不需要可以不写
        .putAttr("username","007")
        .upload();

上传到指定的存储平台

fileStorageService.of(file)
        .setPlatform("aliyun-oss-1")    // 使用指定的存储平台
        .upload();

上传图片并进行处理

fileStorageService.of(file)
        .setThumbnailSuffix(".jpg") //指定缩略图后缀,必须是 thumbnailator 支持的图片格式,默认使用全局的
        .setSaveThFilename("thabc") //指定缩略图的保存文件名,注意此文件名不含后缀,默认自动生成
        .image(img -> img.size(1000,1000))  // 将图片大小调整到 1000*1000
        .thumbnail(th -> th.size(200,200))  // 再生成一张 200*200 的缩略图
        .upload();

直接上传 HttpServletRequest

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

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

spring.servlet.multipart.resolve-lazily: true

接口实现:

@RestController
public class FileUploadController {

    /**
     * 直接读取 HttpServletRequest 中的文件进行上传,成功返回文件信息
     */
    @PostMapping("/upload-request")
    public FileInfo uploadRequest(HttpServletRequest request) {
        return fileStorageService.of(request).upload();
    }
}

监听上传进度

// 方式一
fileStorageService.of(file).setProgressMonitor(progressSize ->
    System.out.println("已上传:" + progressSize)
).upload();

// 方式二
fileStorageService.of(file).setProgressMonitor((progressSize,allSize) ->
    System.out.println("已上传 " + progressSize + " 总大小" + allSize)
).upload();

// 方式三
fileStorageService.of(file).setProgressMonitor(new ProgressListener() {
    @Override
    public void start() {
    System.out.println("上传开始");
    }

    @Override
    public void progress(long progressSize,long allSize) {
        System.out.println("已上传 " + progressSize + " 总大小" + allSize);
    }

    @Override
    public void finish() {
        System.out.println("上传结束");
    }
}).upload();

下载

获取文件信息

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");

监听下载进度

// 方式一
fileStorageService.download(fileInfo).setProgressMonitor(progressSize ->
        System.out.println("已下载:" + progressSize)
).file("C:\\a.jpg");
        
// 方式二
fileStorageService.download(fileInfo).setProgressMonitor((progressSize,allSize) ->
        System.out.println("已下载 " + progressSize + " 总大小" + allSize)
).file("C:\\a.jpg");

// 方式三
fileStorageService.download(fileInfo).setProgressMonitor(new ProgressListener() {
    @Override
    public void start() {
        System.out.println("下载开始");
    }

    @Override
    public void progress(long progressSize,long allSize) {
        System.out.println("已下载 " + progressSize + " 总大小" + allSize);
    }

    @Override
    public void finish() {
        System.out.println("下载结束");
    }
}).file("C:\\a.jpg");

判断文件是否存在

//获取文件信息
FileInfo fileInfo = fileStorageService.getFileInfoByUrl("https://file.abc.com/test/a.jpg");

//判断文件是否存在
boolean exists = fileStorageService.exists(fileInfo);

//直接通过文件信息中的 url 判断文件是否存在,省去手动查询文件信息记录的过程
boolean exists2 = fileStorageService.exists("https://file.abc.com/test/a.jpg");

删除文件

//获取文件信息
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");

最后

推荐的开源项目已经收录到 GitHub 项目,欢迎 Star

https://github.com/chenyl8848/great-open-source-project

或者访问网站,进行在线浏览:

https://chencoding.top:8090/#/

大家的点赞、收藏和评论都是对作者的支持,如文章对你有帮助还请点赞转发支持下,谢谢!文章来源地址https://www.toymoban.com/news/detail-802007.html

到了这里,关于还在手动封装文件上传?快来试试这款一行代码实现多平台文件存储的工具!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .dll文件无法删除?快来试试下面的办法

    .dll文件是软件运行的必备文件,有时候删除一些软件后会残留dll文件没有删掉,且怎么删也删不掉,这该怎么办?这里小编就给大家分享一招轻松删除dll文件的方法。 无法删除.dll文件怎么办? 1、按win+r键后会出现一个界面,然后再输入 regedit,截图如下: 2、然后回车后我

    2024年02月11日
    浏览(44)
  • 快来试试!免费用上GPT-4 !!!

    GPT-4是OpenAI上个月推出的最新人工智能语言模型, 它可以根据给定的文本或生成各种类似于人类语言甚至超越人类语言的文本 ,例如文章、故事、诗歌、代码、对话等。 GPT-4拥有1750亿个参数,是目前最大的语言模型之一,也是最强大的语言模型之一。 它不仅可以处理

    2024年02月06日
    浏览(45)
  • 你还在用Kettle吗?试试这款ETL工具

    当今时代,数字化转型已经成为企业发展的必由之路。数字化转型不仅可以提高企业的效率和生产力,还可以提高企业的竞争力和市场份额。在数字化转型的过程中,数据集成是至关重要的一步,可以帮助企业在数字化转型中实现更高效和可靠的数据服务。 在国内没有更好的

    2024年02月09日
    浏览(51)
  • IDEA中怎么用Postman?这款插件你试试

    Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成 url 和 params。更重要的是他

    2024年04月17日
    浏览(65)
  • 快来试试这几个简单好用的手机技巧吧

    技巧一:相机功能 苹果手机的相机功能确实非常出色,除了出色的像素之外,还有许多其他实用功能可以提升拍摄体验。 这些相机功能提供了更多的选择和便利性,使用户能够更好地适应不同的拍摄需求。 自拍功能:通过选择自拍功能,可以方便地切换到前置摄像头,进行

    2024年02月09日
    浏览(44)
  • 快试试这款自动化测试工具,性能起飞

    在使用龙测 Agent 平台之前,也使用过其他平台的一些产品。相比之下龙测平台功能性和颜值都相当 Nice。下面会通过详细功能以及使用流程为大家详细介绍龙测平台的强大之处。 首先点击 平台体验链接 进入龙测自动化测试平台,会弹框提示简单 4 步带领用户更快熟悉平台功

    2024年02月02日
    浏览(46)
  • 有意思,我的GitHub账号值$23806.2,快来试试你的?

    睡不着,看到一个有意思的网站: Estimate Github Worth Generator 。 它可以用来估算 GitHub 账号的价值。马上试了一下。 我的账号估值: $23806.2 操作很简单,点击Estimate Github Worth Generator,进入网站。 具体如下图: 在唯一的输入框中,输入您的GitHub账号,点击按钮 Generate Worth 按钮

    2024年02月04日
    浏览(56)
  • 想挑战你的智商?快来试试Java版灯谜猜猜乐!

      中秋佳节,是我国传统的重大节日之一。全国各地为了增强过节的气氛,都有许多传统的中秋活动,比如吃月饼、赏月、猜灯谜等等。其中,猜灯谜就是一项极具娱乐性的活动,它不仅可以增进亲友之间的感情,更重要的是,还可以挑战智商,让你的小脑袋飞速运转。

    2024年02月07日
    浏览(40)
  • IDEA的全新UI可以在配置里启用了,快来试试吧!

    刚看到IDEA官方昨天发了这样一条推: IDEA的新UI可以在2022.3版本上直接使用了!开启方法如下: 打开IDEA的 Setting 界面,在 Appearance Behavior 下有个被标注为Beta标签的New UI菜单,具体如下图: 勾选 Enable new UI 选项,然后点击 ok IDEA会提示重启: 这里记录下重启前的样子: 重启之

    2024年02月02日
    浏览(35)
  • 还在crud?快来学习架构设计啦---微服务下的依赖管理(maven篇)

    2023年口罩放开的第一年,大多数人都是想着重新开始,抓住金三银四的好时机,找到心仪的工作和符合岗位要求的人才,一起整装出发。我们理想的状态是,经济已经在恢复了,那么就业市场也应该恢复了。然而现实是残酷的,海投无回应依然是常态。据互联网第三方平台统

    2023年04月19日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包