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

文件是否上传并存储在应用服务器上?

时间:2023-04-02 09:48:20 Java

在一般的项目开发中,都会有文件、图片、视频等文件上传访问的场景。要实现这样的场景,要么将文件存储在应用服务器上,要么构建一个文件服务来存储它。但是,这两种方式也有很多缺点,增加了运维成本。因此,追求用户体验的项目可以考虑使用第三方云服务来实现存储。目前市场主流厂商包括:七牛云、阿里云OSS、腾讯云COS等,具体采用何种存储方案需要结合项目规模、成本等因素综合考虑。因为我的是腾讯云服务器,所以我直接激活了腾讯云的COS对象存储。本文将记录SpringBoot集成腾讯云COS对象存储实现文件上传。1.准备工作集成前需要做一些准备工作,比如开通COS对象存储,创建存储通证,创建访问密钥等。订阅腾讯云对象存储服务的新用户专享,1米可购买1年存储。读书还是很香的。console.cloud.tencent.com/cos创建bucket注意bucketaccess的访问权限,设置为publicreadprivatewrite。密钥管理,创建密钥点击新建密钥,会自动生成。3、集成步骤添加maven依赖代码如下(示例):com.qcloudcos_api5.6.89复制代码yml文件,添加配置代码如下(示例):腾讯云cos配置cos:baseUrl:https://xiliu-24.cos.ap-guangzhou.myqcloud.comsecretId:AKI**iorsecretKey:zZ*z6regionName:ap-guangzhoubucketName:xiliu-24folderPrefix:/upload复制代码新建COS配置类代码如下(示例):packagecom.java.xiliu.config;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;/**@authorxiliu@description腾讯云cos对象存储配置类@date2022/10/28*/@Data@Component@ConfigurationProperties(prefix="cos")publicclassCosConfig{/***bucket访问路径**/privateStringbaseUrl;/***腾讯云账号秘钥**/privateStringsecretId;/***密码秘钥**/privateStringsecretKey;/***bucketregion**/privateStringregionName;/***bucketname**/privateStringbucketName;/***上传根目录**/私有字符串文件夹前缀;publicCOSClientgetCosClient(){//初始化用户信息COSCredentialscosCredentials=newBasicCOSCredentials(this.secretId,this.secretKey);//设置区域Regionregion=newRegion(this.regionName);ClientConfigconfig=newClientConfig(区域);//生成COS客户端COSClientclient=newCOSClient(cosCredentials,config);returnclient;}}复制代码新建一个COS上传工具类代码如下(示例):packagecom.java.xiliu.common.untils.file;importcom.java.xiliu.common.untils.SpringUtils;importcom.java.xiliu.config.CosConfig;importcom.qcloud.cos.COSClient;importcom.qcloud.cos.model.PutObjectRequest;importcom.qcloud.cos.model.UploadResult;importcom.qcloud.cos.transfer.TransferManager;导入com.qcloud.cos.transfer.Upload;导入lombok.extern.slf4j.Slf4j;导入org.apache.commons.io。FilenameUtils;导入org.springframework.web.multipart.MultipartFile;导入java.io.File;导入java.io.IOException;导入java.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.ThreadPoolExecutor;importjava.util.concurrent.TimeUnit;/**@authorxiliu@description腾讯云COS文件上传工具类@date2022/10/31*/@Slf4jpublicclassCosClientUtils{/***获取配置信息*/privatestaticCosConfigcosConfig=SpringUtils.getBean(CosConfig.class);publicstaticStringupload(MultipartFilefile,Stringdir)throwsException{StringoriginalFilename=file.getOriginalFilename();//文件名Stringname=FilenameUtils.getBaseName(originalFilename)+"_"+System.currentTimeMillis()+originalFilename.substring(originalFilename.lastIndexOf("."));//目录StringfolderName=cosConfig.getFolderPrefix()+"/"+dir+"/";字符串键=文件夹名称+名称;文件localFile=null;尝试{localFile=transferToFile(file);StringfilePath=uploadFileToCos(localFile,key);log.info("上传COS成功:{}",filePath);返回文件路径;}抓住(Exceptione){thrownewException("文件上传失败");}最后{localFile.delete();}}/***使用缓冲区创建临时文件*使用MultipartFile.transferTo()*@parammultipartFile*@return*/privatestaticFiletransferToFile(MultipartFilemultipartFile)throwsIOException{StringoriginalFilename=multipartFile.getOriginalFilename();Stringprefix=originalFilename.split("\\.")[0];字符串后缀=originalFilename.substring(originalFilename.lastIndexOf("."));文件file=File.createTempFile(前缀,后缀);multipartFile.transferTo(文件);returnfile;}/***上传文件到COS*@paramlocalFile*@paramkey*@return*/privatestaticStringuploadFileToCos(FilelocalFile,Stringkey)throwsInterruptedException{PutObjectRequestputObjectRequest=newPutObjectRequest(cosConfig.getBucketName(),密钥,本地文件);//获取连接COSClientcosClient=cosConfig.getCosClient();//创建线程池ThreadPoolExecutorthreadPool=newThreadPoolExecutor(8,16,4,TimeUnit.SECONDS,newArrayBlockingQueue(10),newThreadPoolExecutor.AbortPolicy());//传入一个threadPool,如果不传入线程池,默认一个TransferManager会生成一个单独的ThreadpoolTransferManagertransferManager=newTransferManager(cosClient,threadPool);//返回一个异步结果Upload,同步调用waitForUploadResult等待上传完成,成功返回UploadResult,失败则抛出异常Uploadupload=transferManager.upload(putObjectRequest);UploadResultuploadResult=upload.waitForUploadResult();transferManager.shutdownNow();cosClient.shutdown();StringfilePath=cosConfig.getBaseUrl()+uploadResult.getKey();返回文件路径;示例):@ApiOperation(value="UserAvatarUpload")@PostMapping("/profile/avatar")publicRuploadAvatar(@RequestParam("avatarfile")MultipartFilefile)throwsException{if(!file.isEmpty()){Stringavatar=CosClientUtils.upload(file,"avatar");returnR.ok(avatar);}returnR.error("上传头像异常,请联系管理员");}复制代码测试使用Swagger接口文档或Postman测试上传接口,成功返回地址。使用浏览器打开返回地址,可以预览以上就是本文的全部内容,谢谢大家如果觉得文章对您有帮助,别忘了点赞、收藏、关注、评论,您的支持是我创作最大的动力!