薅羊毛之腾讯对象存储系统COS

这里介绍一种利用腾讯的对象存储系统COS来作为自己的个人图床。

腾讯云对象存储系统免费使用的项目

目前腾讯云COS对个人用户可以免费存储50G内容,另外还可以免费获取到每个月10G的CDN流量,更重要的一点是它有十分完善的SDK,支持目前市面上大多数常用语言,这些API用起来也十分的简单方便。

腾讯云COS 支持的SDK

如果自己仅仅是给自己的博客假设一个图床,腾讯云的COS完全是够用的。

使用流程

1. 注册腾讯云账号,开通COS功能

这个没有什么特别注意的,点击腾讯云直接按照步骤一步一步注册就是,注册完成之后创建一个存储桶,最终效果如下图所示,点击进入存储桶,可以上传下载各种类型的文件,就像一个网络硬盘。

我的腾讯云COS存储桶

2. 在小书匠里面可以腾讯云COS当作图床

2.1 打开自己的小书匠,点击主页的绑定按钮,即可进入图床配置页面,点击腾讯云oos存储,就可以将

小书匠配置图床页面

2.2 在腾讯云的密钥管理页面,可以获取到自己私人的SecretIdSecretKey,填写进小书匠配置图床页面。

密钥管理页面

2.3 小书匠配置完成之后就可以直接将将图片拖进小书匠的编辑区域,通过赋值粘贴也可以将图片贴进小书匠,此时小书匠会自动将图片上传至腾讯云的存储桶,并在该页面引用图片地址。

小书匠的图床演示

3. 通过腾讯云COS的Java SDK来给自己的应用添加图床

3.1 给自己的Java应用引入Maven坐标

1
2
3
4
5
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.4.10</version>
</dependency>

3.2 初始化COS并获取COSClient对象,这里类似小书匠图床的配置,也需要设置secretidsecretKey,腾讯给的SDK里面已经封装了一个COSClient类,基本上所有的操作都可以通过这个类来进行,所以整个调用过程十分方便。

1
2
3
4
5
6
7
8
9
// 1 初始化用户身份信息(secretId, secretKey)。
COSCredentials cred = new BasicCOSCredentials("AKIDXXXXXX", "XXXXXXXXXXXXXXX");

// 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
// clientConfig中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者接口文档 FAQ 中说明。
ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing-1"));

// 3 生成 cos 客户端。
COSClient cosClient = new COSClient(cred, clientConfig);

3.3 上传文件的步骤,因为putObject()方法是支持字节流的,可以本地上传,也可以通过网络图片来上传,十分简单,这里需要知道自己怎么访问自己上传的图片,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 指定本地需要存储的文件
File localFile = new File("src/test/resources/len5M.txt");

// 指定要上传到的存储桶名称
String bucketName = "demoBucket-1250000000";

// 指定要上传到 COS 上对象键,这里主要是配置存储的文件名称,如果包含文件夹可以加斜杠,如/markdown/pic.png
String key = "upload_single_demo.txt";

// 配置上传请求对象
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);

// 将文件上传至COS
PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);

3.4 下载文件也十分的简单,只要知道自己文件的访问对象键,就可以很轻松的通过COSClient来获取图片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 指定要下载到的本地路径
File downFile = new File("src/test/resources/mydown.txt");

// 指定文件所在的存储桶
String bucketName = "demoBucket-1250000000";

// 指定文件在 COS 上的对象键,这个对象键包含文件夹,具体规则同上传时配置的对象键
String key = "upload_single_demo.txt";

// 配置请求
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);

// 下载文件
ObjectMetadata downObjectMeta = cosClient.getObject(getObjectRequest, downFile);

3.5 删除文件,这个也是通过COSClient来操作。

1
2
3
4
5
6
// 指定文件所在的存储桶
String bucketName = "demoBucket-1250000000";
// 指定文件在 COS 上的对象键
String key = "upload_single_demo.txt";
// 调用COSClient的删除文件方法
cosClient.deleteObject(bucketName, key);

3.6 个人代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.songwh.alltoforever.controller;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.model.PutObjectResult;
import com.songwh.alltoforever.pojo.ResultBean;
import com.songwh.alltoforever.utils.ResultUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
* @auther SongWH
* @Date 2019/3/10
*/
@RestController
@RequestMapping("/common")
public class CommonController {

@Autowired
private COSClient cosClient;

@Value("${tecent.cos.bucketname}")
private String BUCKET_NAME;

private final static String IMAGE_URL_PRE="https://image.songwh.top";

@RequestMapping("/upload")
public ResultBean upload(MultipartFile file) throws IOException {
InputStream is = file.getInputStream();
String fileName = this.getFileName(file);
try {
PutObjectResult putObjectResult = cosClient.putObject(BUCKET_NAME, fileName, is, null);
}catch (Exception e){
e.printStackTrace();
return ResultUtils.getFailResultBean("文件上传失败");
}
return ResultUtils.getSuccessResultBean(IMAGE_URL_PRE+fileName,"上传成功");
}

private String getFileName(MultipartFile file){
String originalFilename = file.getOriginalFilename();
String fileName = originalFilename.substring(0, originalFilename.lastIndexOf("."));
String extName= originalFilename.substring(originalFilename.lastIndexOf("."));
StringBuilder sb=new StringBuilder();
sb.append("/Java/").append(UUID.randomUUID().toString()).append("_").append(fileName).append(extName);
return sb.toString();
}
}
-------------本文结束感谢您的阅读-------------