阿里云OSS和腾讯云COS解决方案

2020-06-03 09:10:10  卢浮宫  版权声明:本文为站长原创文章,转载请写明出处


一、背景

    在之前个人项目对图片资源的处理是放在本地服务器,然后在程序中添加虚拟路径映射来实现的。

    随着云储存的接触加上本着减轻服务器消耗及保证资源稳定性的目的,开始一步步引入云储存。

    PS: 这里会给出两个常用解决方案(阿里云OSS:公司项目使用;腾讯云COS:个人项目使用)


二、二者的简单对比(个人印象)

    1、阿里云起步早,技术支持和业务范围完善一些,比如OSS可以分目录管理(代码中直接操作),COS则不行(腾讯分为对象存储和文件存储两个业务)

    2、他们都是以储存桶来作为数据的划分标准

    3、OSS有图片文件在线预览,COS没有

    4、COS有图片处理(需开启新业务),OSS没有

    5、定价方面阿里云更贵一些,活动的优惠力度整体小一些

    6、阿里云的服务是以工单完成的,有时会慢一些,腾讯的还没试过

    7、从本质上来说OSS和COS差别不大(开发者、运营者可以自由选择)


三、二者在文件上传的接口上核心代码大致如下

    OSS

    public class OSSClientComponent {

@Value("${image.endPoint}")
private String endpoint;

@Value("${image.accessKeyId}")
private String accessKeyId; // 你的访问AK信息

@Value("${image.accessKeySecret}")
private String accessKeySecret; //你的访问AK信息

@Value("${image.bucketName}")
private String bucketName; // 你之前创建的bucket,确保这个bucket已经创建
private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

//获取OSSClient实例
private OSSClient getOSSClient(){
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
return ossClient;
}

/**
* 上传图片
* @param file
* @return 返回图片的路径
* @throws Exception
*/
public String uploadImage(File file) throws Exception{
if(file==null) {
return null;
}
OSSClient ossClient = null;
try {
ossClient = getOSSClient();
//生成图片名称
String originFileName = file.getName();
String suffix = originFileName.substring(originFileName.lastIndexOf(".")+1);
String key = sdf.format(new Date())+"."+suffix;
// 上传文件流
ossClient.putObject(bucketName, key , file);
return getImgUrl(key);
} finally {
if(ossClient!=null){
ossClient.shutdown();
}
}
}

/**
* MultipartFile方式上传图片
* @param file
* @return 返回图片的路径
* @throws Exception
*/
public String uploadImage(MultipartFile file) throws Exception{
if(file==null) {
return null;
}
OSSClient ossClient = null;
try {
ossClient = getOSSClient();
//生成图片名称
String originFileName = file.getOriginalFilename();
String suffix = originFileName.substring(originFileName.lastIndexOf(".")+1);
// 时间之后拼接上uuid
String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase();
String key = uuid +"."+suffix;
//上传文件流
ossClient.putObject(bucketName, key ,file.getInputStream());
return getImgUrl(key);
}catch (Exception e){
e.printStackTrace();
}finally {
if(ossClient!=null){
ossClient.shutdown();
}
}
return null;
}

/**
* 删除图片
* @param key
*/
public void deleteImage(String key) throws Exception{
// 创建OSSClient实例。
OSSClient ossClient = null;
try {
ossClient = getOSSClient();
// 删除文件。
ossClient.deleteObject(bucketName,key);
} finally {
if(ossClient!=null){
ossClient.shutdown();
}
}
}

/**
* 获得url链接(暂时保存半年)
* @param key
* @return
*/
public String getImgUrl(String key) {
OSSClient ossClient = getOSSClient();
//设置过期时间
Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365/2);
//生成URL
URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
if (url != null) {
return url.toString();
}
return null;
}
}

    COS:

    /**
* @author XA
* date 2020/5/26 8:53
* description 腾讯云COS工具类
* params
* return
*/
public class CosUtil {

// 1 初始化用户身份信息(secretId, secretKey)
static COSCredentials cred = new BasicCOSCredentials("XXX", "XXX");
// 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
// clientConfig中包含了设置region, https(默认http), 超时, 代理等set方法, 使用可参见源码或者接口文档FAQ中说明
static ClientConfig clientConfig = new ClientConfig(new Region("ap-guangzhou"));
// 3 生成cos客户端
static COSClient cosClient = new COSClient(cred, clientConfig);
// bucket的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式
static String bucketName = "XXX";

/**
* 功能描述: 上传文件到COS
* Param: [file]
* Return: java.lang.String
*/
public static String uploadForFile(File file){
String key = DateUtil.getLocalStr() + UUID.randomUUID() + ".jpg";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, file);
cosClient.putObject(putObjectRequest);
Date expiration = new Date(new Date().getTime() + 5 * 60 * 10000);
URL url = cosClient.generatePresignedUrl(bucketName, key, expiration);
return url.toString();
}

/**
* 功能描述: 下载文件到本地
* Param: [key]
* Return: void
*/
public void download(String key){
// 设置要下载到的本地路径
File downFile = new File("C://Users//Administrator//Desktop//sc1.jpg");
// 设置要下载的文件所在的 对象桶的名称 和对象键
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
ObjectMetadata downObjectMeta = cosClient.getObject(getObjectRequest, downFile);
System.out.println(downObjectMeta);
}

/**
* 功能描述: 删除文件
* Param: [key]
* Return: void
*/
public void del(String key){
cosClient.deleteObject(bucketName, key);
}

}


四、注意事项

    1、在OSS中如果文件名相同是覆盖的关系,所以当你有并发操作是如果文件名相同则会数据丢失

    2、OSS数据写入时最好用二级目录来做数据分块,这样后续的一些业务处理和数据追踪比较好处理一些

    3、目前来看,腾讯云分为对象存储和文件存储。对象存储是无层次结构的分布式储存产品

    4、过期时间根据需求自定义操作

    5、如果说对信息隐私性需求较高,可以在安全密匙、子账户、读写权限等方面做处理




更多精彩请关注guangmuhua.com


最新评论: