当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-01 23:11:28 Java

大家好,我是小福~又是做好事的一天,小可爱私下问我有没有好用的springboot文件上传工具,这个可惜了,我的私藏了好东西,顺便分享给朋友们。demo地址在文末。文件上传是一个正常的功能,做后端开发的基本都可以使用。虽然不难,但是有点麻烦。数据流的打开关闭和读取也容易出错,尤其是在连接一些OSS对象存储平台的时候。一个平台的一堆SDK代码看起来很乱。下面给大家推荐一个工具SpringFileStorage。上传文件只需要简单的配置和一行代码就可以搞定。开发效率很高。看看有没有这样的流!官网:https://spring-file-storage.x...SpringFileStorage工具整合了市面上几乎所有的OSS对象存储平台,包括本地、FTP、SFTP、WebDAV、阿里云OSS、华为云OBS、七牛云Kodo、腾讯云COS、百度云BOS、优派云USS、MinIO、京东云OSS、网易书凡NOS等兼容S3协议的平台,都可以在springboot中以非常简单的方式实现文件存储。下面的简单配置以本地和阿里云OSS上传为例,在pom.xml中导入必要的spring-file-storage.jar。注意:如果要上传文件到OSS平台,需要导入对应平台的SDK包。cn.xuyanwuspring-file-storage0.5.0com.aliyun.ossaliyun-sdk-oss3.10.2在application.yml文件中配置一些基本信息。enable-storage:状态为启用时才会被识别default-platform:默认上传平台domain:生成文件url中访问的域名base-path:存储地址thumbnail-suffix:缩略图后缀如果上传到OSS对象存储平台,只需将aliyunoss提供的变量配置到相应的模块即可。spring:#文件存储配置(local,oss)file-storage:default-platform:local-1thumbnail-suffix:".min.jpg"#缩略图后缀local:-platform:local-1#存储平台识别enable-storage:true#是否开启此存储(只能选择一个)enable-access:true#开启访问(请在线使用Nginx配置,效率更高)domain:"http://127.0.0.1:2222"#Access域名,注意和path-patterns保持一致,“/”结尾base-path:/tmp/Pictures/#存储地址path-patterns:/**#accesspathaliyun-oss:-platform:aliyun-ossenable-storage:trueaccess-key:xxxxsecret-key:xxxxend-point:xxxbucket-name:firebookdomain:http://fire100.topbase-path:#在springboot启动类中添加注解@EnableFileStorage云平台文件路径,显式开启文件上传功能,现在可以使用@EnableFileStorage//文件上传工具@SpringBootApplicationpublicclassSpringbootFileStorageApplication{publicstaticvoidmain(String[]args){SpringApplication.run(SpringbootFileStorageApplication.class,args);}}上传文件接下来介绍业务类中的FileStorageService服务,只要如下一行代码,就可以完成文件上传,是不是Soeasy,下载也是同样的方法@RestControllerpublicclassFileController{@AutowiredprivateFileStorageServicefileStorageService;/***公众号:程序员小付*上传文件*/@PostMapping(value={"/upload"})publicObjectupload(MultipartFilefile){FileInfoupload=fileStorageService.of(file).upload();返回上传;}}我们使用postman测试上传一张图片,看到图片已经上传成功传递到/tmp/Pictures目录下,返回结果包含访问文件的完整URL路径。不仅如此,spring-file-storage还支持多种文件格式,URI、URL、String、byte[]、InputStream、MultipartFile,让开发更加灵活。文件上传功能,更多的时候我们是在上传图片,这时就会有动态裁剪图片和生成缩略图的需求,这些spring-file-storage都可以轻松实现。/***公众号:程序员小付*裁剪上传的图片并生成缩略图*/@PostMapping("/uploadThumbnail")publicFileInfouploadThumbnail(MultipartFilefile){returnfileStorageService.of(file).image(img->img.size(1000,1000))//将图片调整为1000*1000.thumbnail(th->th.size(200,200))//再生成一个200*200的缩略图.upload();}我们也可以动态的选择上传平台,配置文件中所有平台都开启了,实际使用中我们可以自由选择。/***公众号:程序员小付*上传文件到指定存储平台,返回文件信息成功*/@PostMapping("/upload-platform")publicFileInfouploadPlatform(MultipartFilefile){returnfileStorageService.of(file).setPlatform("aliyun-oss")//使用指定的存储平台.upload();}下载文件下载文件也很简单,直接根据文件url或文件流即可下载。/***公众号:程序员小付*下载文件*/@PostMapping("/download")publicvoiddownload(MultipartFilefile){//获取文件信息FileInfofileInfo=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(newProgressListener(){@Overridepublicvoidstart(){System.out.println("downloadstart");}@Overridepublicvoidprogress(longprogressSize,longallSize){System.out.println("已下载"+progressSize+"总大小"+allSize);}@Overridepublicvoidfinish(){System.out.println("下载完成");}})。文件("C:\\a.jpg");fileexists,delete我们也可以根据文件的URL地址判断文件是否存在,删除文件。//直接通过文件信息中的url删除,省去了手动查询文件信息记录的过程fileStorageService.delete("http://file.abc.com/test/a.jpg");//直接通过文件信息url判断文件是否存在,省去手动查询文件信息记录booleanexists2=fileStorageService.exists("http://file.abc.com/test/a.jpg");aspect工具也提供了每个操作的Aspects,你可以在每个action前后进行干预,比如打日志或者耍花样,实现FileStorageAspect类重写对应action的xxxAround方法。***使用aspect打印文件上传删除日志*/@Slf4j@ComponentpublicclassLogFileStorageAspectimplementsFileStorageAspect{/***上传成功,返回文件信息,失败返回null*/@OverridepublicFileInfouploadAround(UploadAspectChainchain,FileInfofileInfo,UploadPretreatmentpre,FileStoragefileStorage,FileRecorderfileRecorder){log.info("上传文件之前->{}",fileInfo);fileInfo=chain.next(fileInfo,pre,fileStorage,fileRecorder);log.info("上传文件后->{}",fileInfo);返回文件信息;}}Demo案例地址:https://github.com/chengxy-nd...总结使用该工具确实大大降低了上传文件的代码量,提高了开发效率。我在使用过程中没有发现任何陷阱。好东西分享给大家。如果它满足您的需求,请毫不犹豫地使用它。技术交流,公众号:程序员小付

猜你喜欢