当前位置:首页 > 文章 > 正文内容

Springboot 一行代码实现文件上传 20个平台!少写代码到极致

廖万里3年前 (2022-10-28)文章5520

大家好,我是小富~

又是做好人好事的一天,有个小可爱私下问我有没有好用的springboot文件上传工具,这不巧了嘛,正好我私藏了一个好东西,顺便给小伙伴们也分享一下,demo地址放在文末了。

Springboot 一行代码实现文件上传 20个平台!少写代码到极致


文件上传在平常不过的一个功能,做后端开发的基本都会接触到,虽然不难可着实有点繁琐。数据流的开闭、读取还容易出错,尤其是在对接一些OSS对象存储平台,一个平台一堆SDK代码看起来乱糟糟的。

下边给我大家推荐一个工具Spring File Storage,上传文件只要些许配置一行代码搞定,开发效率杠杠的,一起看看是不是有这么流批!

官网:https://spring-file-storage.xuyanwu.cn

Spring File Storage工具几乎整合了市面上所有的OSS对象存储平台,包括本地FTPSFTPWebDAV阿里云OSS华为云OBS七牛云Kodo腾讯云COS百度云 BOS又拍云USSMinIO京东云 OSS网易数帆 NOS等其它兼容 S3 协议的平台,只要在springboot中通过极简的方式就可以实现文件存储。

Springboot 一行代码实现文件上传 20个平台!少写代码到极致


简单配置

下边以本地和Aliyun OSS上传为例,pom.xml中引入必要的spring-file-storage.jar注意: 如果要上传文件到OSS平台,需要引入对应平台的SDK包。

<!-- spring-file-storage 必须要引入 --><dependency>
    <groupId>cn.xuyanwu</groupId>
    <artifactId>spring-file-storage</artifactId>
    <version>0.5.0</version></dependency><!-- 阿里云oss --><dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version></dependency>

application.yml文件中配置些基础信息。

  • enable-storage:只有状态开启才会被识别到

  • default-platform:默认的上传平台

  • domain:生成的文件url中访问的域名

  • base-path:存储地址

  • thumbnail-suffix:缩略图后缀

要是上传OSS对象存储平台,将aliyun oss提供的变量配置到相应的模块上即可。

spring:
  #文件存储配置(本地、oss)
  file-storage:
    default-platform: local-1
    thumbnail-suffix: ".min.jpg" #缩略图后缀
    local:
      - platform: local-1 # 存储平台标识
        enable-storage: true #是否开启本存储(只能选一种)
        enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高)
        domain: "http://127.0.0.1:2222" #访问域名,注意后面要和path-patterns保持一致,“/”结尾
        base-path: /tmp/Pictures/ # 存储地址
        path-patterns: /** #访问路径
    aliyun-oss:
      - platform: aliyun-oss
        enable-storage: true
        access-key: xxxx
        secret-key: xxxx
        end-point: xxx
        bucket-name: firebook
        domain: http://fire100.top
        base-path: #云平台文件路径

springboot启动类中增加注解@EnableFileStorage,显式的开启文件上传功能,到这就可以用了

@EnableFileStorage // 文件上传工具@SpringBootApplicationpublic class SpringbootFileStorageApplication {    public static void main(String[] args) {        SpringApplication.run(SpringbootFileStorageApplication.class, args);
    }
}

上传文件

接下来在业务类中引入FileStorageService服务,如下只要一行代码就可以完成文件上传,是不是So easy,下载也是如法炮制。

@RestControllerpublic class FileController {    @Autowired
    private FileStorageService fileStorageService;    /**
     * 公众号:程序员小富
     * 上传文件
     */
    @PostMapping(value = {"/upload"})
    public Object upload(MultipartFile file) {
        FileInfo upload  = fileStorageService.of(file).upload();        return upload;
    }
}

我们用postman测试上传一张图片,看到图片已经成功传到了/tmp/Pictures目录下,返回结果中包含了完整的访问文件的URL路径。

Springboot 一行代码实现文件上传 20个平台!少写代码到极致


Springboot 一行代码实现文件上传 20个平台!少写代码到极致


不仅如此spring-file-storage还支持多种文件形式,URIURLStringbyte[]InputStreamMultipartFile,使开发更加灵活。

Springboot 一行代码实现文件上传 20个平台!少写代码到极致


文件上传功能,更多时候我们都是在上传图片,那就会有动态裁剪图片生成缩略图的需求,这些 spring-file-storage 都可以很容易实现。

/**
 * 公众号:程序员小富
 * 上传图片裁剪大小并生成一张缩略图
 */@PostMapping("/uploadThumbnail")
public FileInfo uploadThumbnail(MultipartFile file) {    return fileStorageService.of(file)            .image(img -> img.size(1000,1000))  //将图片大小调整到 1000*1000
            .thumbnail(th -> th.size(200,200))  //再生成一张 200*200 的缩略图
            .upload();
}

而且我们还可以动态选择上传平台,配置文件中将所有平台开启,在实际使用中自由的选择。

/**
 * 公众号:程序员小富
 * 上传文件到指定存储平台,成功返回文件信息
 */@PostMapping("/upload-platform")public FileInfo uploadPlatform(MultipartFile file) {    return fileStorageService.of(file)
            .setPlatform("aliyun-oss")    //使用指定的存储平台
            .upload();
}

下载文件

下载文件也同样的简单,可以直接根据文件url或者文件流下载。

/**
 * 公众号:程序员小富
 * 下载文件
 */@PostMapping("/download")public void download(MultipartFile file) {    // 获取文件信息
    FileInfo fileInfo = fileStorageService.getFileInfoByUrl("http://file.abc.com/test/a.jpg");    
    // 下载到文件
    fileStorageService.download(fileInfo).file("C:\\a.jpg");    // 直接通过文件信息中的 url 下载,省去手动查询文件信息记录的过程
    fileStorageService.download("http://file.abc.com/test/a.jpg").file("C:\\a.jpg");    // 下载缩略图
    fileStorageService.downloadTh(fileInfo).file("C:\\th.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");

文件存在、删除

我们还可以根据文件的URL地址来判断文件是否存在、以及删除文件。

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

切面

工具还提供了每种操作的切面,可以在每个动作的前后进行干预,比如打日志或者玩点花活,实现FileStorageAspect类重写对应动作的xxxAround方法。

**
 * 使用切面打印文件上传和删除的日志
 */@Slf4j@Componentpublic class LogFileStorageAspect implements FileStorageAspect {    /**
     * 上传,成功返回文件信息,失败返回 null
     */
    @Override
    public FileInfo uploadAround(UploadAspectChain chain, FileInfo fileInfo, UploadPretreatment pre, FileStorage fileStorage, FileRecorder fileRecorder) {
        log.info("上传文件 before -> {}",fileInfo);
        fileInfo = chain.next(fileInfo,pre,fileStorage,fileRecorder);
        log.info("上传文件 after -> {}",fileInfo);        return fileInfo;
    }
}

demo案例地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-file-storage

总结

用了这个工具确实极大的减少了上传文件所带来的代码量,提升了开发效率,使用过程中暂未发现有什么坑,好东西就是要大家分享,如果符合你的需求,犹豫什么用起来吧。

我是小富,下期见~

全网搜:程序员小富。

整理了几百本各类技术电子书,有需要的同学可以,私信或者评论【666】 自取。还有想要加技术群的同学可以加我好友,和大佬侃技术、不定期内推,程序员的内点事这都有。

Springboot 一行代码实现文件上传 20个平台!少写代码到极致



本文链接:https://www.kkkliao.cn/?id=199 转载需授权!

分享到:

版权声明:本文由廖万里的博客发布,如需转载请注明出处。


“Springboot 一行代码实现文件上传 20个平台!少写代码到极致” 的相关文章

突然崩了!一则大消息,这类股集体跳水,2000亿巨头重挫12%!千亿疫苗白马暴跌16%!信创板块又火了,恒生科技指数继续大涨

突然崩了!一则大消息,这类股集体跳水,2000亿巨头重挫12%!千亿疫苗白马暴跌16%!信创板块又火了,恒生科技指数继续大涨

中国基金报 颜颖大家好,来一起关注今天上午的市场行情和最新资讯。10月27日上午,A股重要指数全线高开:上证指数高开0.18%,深证成指涨0.23%,创业板指涨0.18%。盘面上,发电设备、贵金属、教育等板块早盘涨幅居前,医疗板块陷入调整,旅游、海运等板块跌幅居前。港股市场高调高开:恒指高开2.63...

步步高创始人段永平,高手有所为有所不为,35条深度思考值得收藏

步步高创始人段永平,高手有所为有所不为,35条深度思考值得收藏

段永平,一个注定在商业史无法被忽视的存在。段永平的经历可谓传奇。他是国内第一个拍下来股神巴菲特午餐的男人,那时候他还带上了现在拼多多的创始人黄铮。而这个一手创办了小霸王、步步高等著名企业,并与Vivo、OPPO、一加和拼多多有着千丝万缕联系的企业家,这位通过投资网易、腾讯和苹果而获利颇丰的投资者,也...

微信一定要关闭的6个设置

微信一定要关闭的6个设置

微信里面的个人隐私信息必须要注意,尤其是微信里面设置里面的一些功能,都应该要及时关闭,以免自己就的个人隐私遭到暴露。1,自动扣费/免密支付项目点击我→服务→点击钱包→选择支付设置→关闭自动续费、免密支付,这两项不需要的。2,关闭自动下载点击我→设置→点击通用→选择照片/视频→关闭自动下载。如果不关闭...

netcore有好用的word(docx)、excel(xlsx)及pdf 处理库吗?

如题,所有需求都基于开源免费库基础word主要用来做模版替换,能有docx转pdf最好excel主要用来导入导出,能生成导入模版文件,能设置每个导入模版的下拉框数据(能从数据库读数据)pdf主要用来添加水印文件或者图片。在此感谢分享...

“双十一”部分手机价格先涨价再降价?券后价格反而比平时贵

“双十一”部分手机价格先涨价再降价?券后价格反而比平时贵

记者 宗智10月24日晚上八点,“双十一”的“先锋号角”已然奏响。从“光棍节”到全民参与的消费狂欢日,从最初的27个商家到现在来自全球各地的29万个品牌,互联网电商一路高歌猛进,其规模与影响力不断扩大,连续创造了13年“神话”。然而,随着消费者生活水平的提升,平台补贴活动走向日常化,低价早已不再是“...

特斯拉再降价,为何受伤最大的不是比亚迪?

特斯拉再降价,为何受伤最大的不是比亚迪?

特斯拉降价算新闻吗?素有“韭菜收割机”之称的特斯拉,不论涨价或者降价都是再普通不过的常规操作,但是这一次,轻轻松松就闯上了热搜。降一次价,上一次热搜?当然这一方面,是因为本次降价幅度不小,Model 3官降1.3万到1.8万元不等,主销车型Model Y最高降幅甚至达到3.7万元。就算结合客观情况,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。