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

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

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

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

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

腾讯云COS 支持的SDK
腾讯云COS 支持的SDK

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

使用流程

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

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

我的腾讯云COS存储桶
我的腾讯云COS存储桶

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

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

小书匠配置图床页面
小书匠配置图床页面

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

密钥管理页面
密钥管理页面

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对象,这里类似小书匠图床的配置,也需要设置secretidsecretKey,腾讯给的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();
    }
}

猜你喜欢

转载自www.cnblogs.com/alltoforever/p/12678488.html