大锯老师在做博客项目时,说过将图片的上传改为cos会加快访问速度。一直想改,一直没改。最近参考了几位同学的文章,终于是把管理中心,后台全改了,记录一下。 #1.开启存储桶
这里默认你已经有了腾讯云账户,哈哈。很简单,拿微信去注册就行了。接下来介绍cos。
在控制台选择对象存储
选择存储桶列表,新建存储桶
这些值按照自己的喜欢填写然后点击确定:
然后点击这个存储桶,进入存储桶设置
记住这些基本信息,下面会用得到
2.java实现
2.1添加依赖
在我们的springboot工程中添加相应的依赖。这里尽量选这个版本,低于这个版本的,对于存储桶名称的正则识别是不对的。
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.8</version>
</dependency>
2.2编写上传工具类
public class UploadImageToCosUtils {
public static String uploadImage(MultipartFile file) {
// 1 初始化用户身份信息(secretId, secretKey,可在腾讯云后台中的API密钥管理中查看!
COSCredentials cred = new BasicCOSCredentials(Constants.COS.ACCESS_KEY_ID, Constants.COS.ACCESS_KEY_SECRET);
// 2 设置bucket的区域, COS地域的简称请参照
// https://cloud.tencent.com/document/product/436/6224,根据自己创建的存储桶选择地区
ClientConfig clientConfig = new ClientConfig(new Region(Constants.COS.SAVE_AREA));
COSClient cosClient = new COSClient(cred, clientConfig);
String fileName = file.getName();
try {
//获得文件类型
String substring = file.getContentType();
//获得文件名
String originalFilename = file.getOriginalFilename();
//获得文件类型
String type = getType(substring, originalFilename);
Random random = new Random();
//命名,其中bg/是我创建的一个文件夹
fileName = "bg/" + random.nextInt(10000) + System.currentTimeMillis()+ "." + type;
//必须设置文件格式,不然打开地址就是直接下载 不可以预览
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType(substring);
InputStream in = file.getInputStream();
PutObjectRequest putObjectRequest = new PutObjectRequest(Constants.COS.BUCKET_NAME, fileName, in, meta);
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭客户端(关闭后台线程)
cosClient.shutdown();
}
return fileName;
}
public static String getType(String contentType, String name) {
String type = null;
if (Constants.ImageType.TYPE_PNG_WITH_PREFIX.equals(contentType)
&& name.endsWith(Constants.ImageType.TYPE_PNG)) {
type = Constants.ImageType.TYPE_PNG;
} else if (Constants.ImageType.TYPE_GIF_WITH_PREFIX.equals(contentType)
&& name.endsWith(Constants.ImageType.TYPE_GIF)) {
type = Constants.ImageType.TYPE_GIF;
} else if (Constants.ImageType.TYPE_JPG_WITH_PREFIX.equals(contentType)
&& name.endsWith(Constants.ImageType.TYPE_JPG)) {
type = Constants.ImageType.TYPE_JPG;
}
return type;
}
}
此时我们的工具类返回的fileName就是上传图片的地址,但是这个地址是不加域名的,所以想要访问,我们还要加上我们的域名"http://xx.xxx.xxx",组合后的全路径名就可以访问图片了。