需求背景:
项目中需要上传图片。
存储方式:
使用腾讯云的OSS组件。
代码实现:
1、使用腾讯云OSS需要使用的参数信息:
OSS的域名;
OSS的地域节点;
OSS存储桶的名称;
OSS权限凭证;
OSS权限访问秘钥;
OSS图片存储策略;
使用的缩略图策略;
允许上传的图片类型;
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; @Data @Component @ConfigurationProperties(prefix = "oss.tencent") public class TencentProperties { /**域名*/ private String domain; /**地域节点*/ private String region; /**存储桶名称*/ private String bucketName; /**secretId*/ private String secretId; /**secretKey*/ private String secretKey; /**图片策略*/ private String styleRule; /**缩略图策略*/ private String thumbnailStyleRule; /**文件类型*/ private List<String> fileTypes; }
参数yml文件或者通过配置中心进行配置
oss: tencent: domain: region: ap-XXX bucketName: XXX secretId: XXXXXX secretKey: XXXXXX styleRule: thumbnailStyleRule: "!Photo_Compression" fileTypes: ## 允许上传的文件类型 - png - jpg - jpeg - gif - bmp - svg
2、上传图片操作工具类service
import java.io.InputStream; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.http.HttpProtocol; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObjectRequest; import com.qcloud.cos.model.UploadResult; import com.qcloud.cos.region.Region; import com.qcloud.cos.transfer.TransferManager; import com.qcloud.cos.transfer.TransferManagerConfiguration; import com.qcloud.cos.transfer.Upload; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import lombok.extern.slf4j.Slf4j; @Slf4j @Component("tencent") public class TencentFileHandle implements FileStrategy { @Autowired TencentProperties tencentProperties; // 创建 COSClient 实例,这个实例用来后续调用请求 COSClient createCOSClient() { // 设置用户身份信息。 // SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理 String secretId = tencentProperties.getSecretId(); String secretKey = tencentProperties.getSecretKey(); COSCredentials cred = new BasicCOSCredentials(secretId, secretKey); // ClientConfig 中包含了后续请求 COS 的客户端设置: ClientConfig clientConfig = new ClientConfig(); // 设置 bucket 的地域 // COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224 clientConfig.setRegion(new Region(tencentProperties.getRegion())); // 设置请求协议, http 或者 https // 5.6.53 及更低的版本,建议设置使用 https 协议 // 5.6.54 及更高版本,默认使用了 https clientConfig.setHttpProtocol(HttpProtocol.https); // 以下的设置,是可选的: // 设置 socket 读取超时,默认 30s clientConfig.setSocketTimeout(30*1000); // 设置建立连接超时,默认 30s clientConfig.setConnectionTimeout(30*1000); // 如果需要的话,设置 http 代理,ip 以及 port // clientConfig.setHttpProxyIp("httpProxyIp"); // clientConfig.setHttpProxyPort(80); // 生成 cos 客户端。 return new COSClient(cred, clientConfig); } // 创建 TransferManager 实例,这个实例用来后续调用高级接口 TransferManager createTransferManager() { // 创建一个 COSClient 实例,这是访问 COS 服务的基础实例。 // 详细代码参见本页: 简单操作 -> 创建 COSClient COSClient cosClient = createCOSClient(); // 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源 // 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。 ExecutorService threadPool = Executors.newFixedThreadPool(32); // 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。 TransferManager transferManager = new TransferManager(cosClient, threadPool); // 设置高级接口的配置项 // 分块上传阈值和分块大小分别为 5MB 和 1MB TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration(); transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024); transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024); transferManager.setConfiguration(transferManagerConfiguration); return transferManager; } void shutdownTransferManager(TransferManager transferManager) { // 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。 // 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。 transferManager.shutdownNow(true); } @Override public UploadDto upload(MultipartFile file) throws Exception { return upload(file, null); } @Override public UploadDto upload(MultipartFile file, String filePath) throws Exception { //文件名 String fileFullName = FileUtil.getName(file.getOriginalFilename()); InputStream inputStream = file.getInputStream(); return upload(inputStream, fileFullName, filePath); } public UploadDto upload(InputStream inputStream, String fileFullName, String filePath) throws Exception { if (inputStream == null) { throw new Exception("上传文件不能为空"); } TransferManager transferManager = createTransferManager(); String bucketName = tencentProperties.getBucketName(); //int inputStreamLength = 1024 * 1024; // byte data[] = new byte[inputStreamLength]; // InputStream inputStream = new ByteArrayInputStream(data); ObjectMetadata objectMetadata = new ObjectMetadata(); // 上传的流如果能够获取准确的流长度,则推荐一定填写 content-length // 如果确实没办法获取到,则下面这行可以省略,但同时高级接口也没办法使用分块上传了 //objectMetadata.setContentLength(inputStreamLength); try { //时间戳 String timestamp = String.valueOf(System.currentTimeMillis()); //文件扩展名 String extension = FileUtil.getSuffix(fileFullName); String fileName = FileUtil.getPrefix(fileFullName); List<String> fileTypes = tencentProperties.getFileTypes(); if(fileTypes != null) { boolean flag= fileTypes.contains(extension); Assert.isTrue(flag, "不支持上传的文件类型:" + extension); } String upFilePath = StringUtils.join(fileName, "_", timestamp, ".", extension); if(filePath != null) { upFilePath = StringUtils.join(filePath, "/", upFilePath); } String key = upFilePath; PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata); // 高级接口会返回一个异步结果Upload // 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回UploadResult, 失败抛出异常 Upload upload = transferManager.upload(putObjectRequest); UploadResult uploadResult = upload.waitForUploadResult(); if (uploadResult == null) { log.error("上传附件到腾讯云失败 fileName={}", upFilePath); throw new Exception("上传附件 " + upFilePath + " 到腾讯云失败 "); } log.info("cos fileName:" + upFilePath); //返回上传结果 UploadDto uploadDto = new UploadDto(); uploadDto.setName(upFilePath); // uploadDto.setKey(upFilePath); uploadDto.setCreateTime(DateUtil.date()); return uploadDto; } catch (Exception e) { log.error("cos 上传失败", e); throw new RuntimeException("文件="+fileFullName + " 上传失败"); } finally { shutdownTransferManager(transferManager); } } @Override public byte[] download(String key) throws Exception { return null; } @Override public void delete(String key) { } }
import java.io.Serializable; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; @Data public class UploadDto implements Serializable { /** * */ private static final long serialVersionUID = 1L; /**图片名*/ private String name; /**图片路径*/ private String imgUrl; /**上传日期*/ @JsonFormat(pattern = "yyyy-MM-dd") private Date createTime; }
3、maven需要引入的腾讯云OSS依赖
<!--cos --> <dependency> <groupId>com.qcloud</groupId> <artifactId>cos_api</artifactId> <version>5.6.89</version> </dependency>
——————-
腾讯云OSS(Object Storage Service)是一种基于对象的存储服务,提供高可用、高可靠、低成本、可扩展的存储资源。以下是腾讯云OSS的原理与使用:
一、腾讯云OSS原理
腾讯云OSS采用分布式存储架构,将数据分散存储在多个节点上,以提高数据的可靠性和可用性。每个节点都采用副本冗余的方式进行数据备份,确保数据不会因为某个节点故障而丢失。同时,通过分布式负载均衡技术,将数据均匀分布在各个节点上,提高数据访问的效率和稳定性。
腾讯云OSS采用数据冗余和容错技术,确保数据的可靠性和可用性。在分布式存储架构中,每个数据块都会备份多个副本,分布在不同的节点上,确保即使某个节点发生故障,其他节点上的副本仍然可用。此外,腾讯云OSS还采用数据校验技术,对数据进行冗余校验,检测数据是否损坏或丢失。
腾讯云OSS采用数据加密和安全保护技术,确保数据的安全性。在数据传输过程中,腾讯云OSS采用SSL/TLS加密技术,对数据进行加密传输,防止数据被窃取或篡改。在数据存储时,腾讯云OSS采用加密技术对数据进行加密存储,确保数据在存储时不会被窃取或篡改。
二、腾讯云OSS使用
首先需要注册腾讯云账号并登录到腾讯云控制台,然后在服务列表中找到并选择“对象存储服务(OSS)”。
在腾讯云OSS控制台中,可以选择创建新的存储空间。填写存储空间的名称、选择地域和存储类型等信息,并设置访问权限和安全策略等。
在腾讯云OSS控制台中,可以上传文件到创建的存储空间中。可以选择上传本地文件或直接上传文件流。在上传文件时,可以选择文件的名称、存储类型和访问权限等信息。
在腾讯云OSS控制台中,可以下载存储空间中的文件。可以选择下载文件的名称、下载路径和下载方式等信息。同时,也可以设置下载文件的访问权限和有效期等。
在腾讯云OSS控制台中,可以删除存储空间中的文件。选择要删除的文件名称,点击删除即可。需要注意的是,删除的文件将无法恢复,请谨慎操作。
为了提高文件的访问速度,可以在腾讯云OSS控制台中配置cdn加速服务。配置完成后,将通过CDN节点加速访问存储空间中的文件。可以提高文件的响应速度和可扩展性。
以上是腾讯云OSS的原理与使用简介,供您参考。如需获取更多详细信息,建议访问腾讯云官网或咨询其官方客服人员。
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/31672