薅羊毛之腾讯对象存储系统COS
这里介绍一种利用腾讯的对象存储系统COS来作为自己的个人图床。
腾讯云对象存储系统免费使用的项目
目前腾讯云COS对个人用户可以免费存储50G内容,另外还可以免费获取到每个月10G的CDN流量,更重要的一点是它有十分完善的SDK,支持目前市面上大多数常用语言,这些API用起来也十分的简单方便。
如果自己仅仅是给自己的博客假设一个图床,腾讯云的COS完全是够用的。
使用流程
1. 注册腾讯云账号,开通COS
功能
这个没有什么特别注意的,点击腾讯云直接按照步骤一步一步注册就是,注册完成之后创建一个存储桶,最终效果如下图所示,点击进入存储桶,可以上传下载各种类型的文件,就像一个网络硬盘。
2. 在小书匠里面可以腾讯云COS当作图床
2.1 打开自己的小书匠,点击主页的绑定
按钮,即可进入图床配置页面,点击腾讯云oos存储
,就可以将
2.2 在腾讯云的密钥管理页面,可以获取到自己私人的SecretId
与SecretKey
,填写进小书匠配置图床页面。
2.3 小书匠配置完成之后就可以直接将将图片拖进小书匠的编辑区域,通过赋值粘贴也可以将图片贴进小书匠,此时小书匠会自动将图片上传至腾讯云的存储桶,并在该页面引用图片地址。
3. 通过腾讯云COS的Java SDK来给自己的应用添加图床
3.1 给自己的Java
应用引入Maven
坐标
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.4.10</version>
</dependency>
3.2 初始化COS
并获取COSClient
对象,这里类似小书匠图床的配置,也需要设置secretid
与secretKey
,腾讯给的SDK里面已经封装了一个COSClient
类,基本上所有的操作都可以通过这个类来进行,所以整个调用过程十分方便。
// 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()
方法是支持字节流的,可以本地上传,也可以通过网络图片来上传,十分简单,这里需要知道自己怎么访问自己上传的图片,
// 指定本地需要存储的文件
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
来获取图片。
// 指定要下载到的本地路径
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
来操作。
// 指定文件所在的存储桶
String bucketName = "demoBucket-1250000000";
// 指定文件在 COS 上的对象键
String key = "upload_single_demo.txt";
// 调用COSClient的删除文件方法
cosClient.deleteObject(bucketName, key);
3.6 个人代码示例
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://shuiruoyan-1255322941.cos.ap-guangzhou.myqcloud.com";
@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();
}
}