---------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处] 
文章出处:http://blog.csdn.net/sdksdk0/article/details/53639792
作者:朱培      ID:sdksdk0     

--------------------------------------------------------------------------------------------

在很多图片上传以及文件上传下载操作的时候,我之前一直使用的是nginx在服务器中划分出一个静态的文件服务器,我主要用于存放图片。然后因为某种原因,然后我换成了COS。

官网的简介是这样的:

对象存储服务(Cloud Object Service)是面向企业和个人开发者提供的高可用,高稳定,强安全的云端存储服务。您可以将任意数量和形式的非结构化数据放入COS,并在其中实现数据的管理和处理。COS支持标准的Restful API接口,您可以快速上手使用,按实际使用量计费,无最低使用限制。

然后我最开始是抱着死马当活马医的心态来使用的,进度上面要求我是要尽快完成的,而且我发现对于我这种小网站来说使用这个COS服务基本上是免费的,简直就是捡到宝的感觉,哈哈!所以我就赶紧放弃了我的nginx图片服务器。然后去github上面下载他们的官方文档。

https://github.com/tencentyun/cos-java-sdk-v4

在在里面有个demo.java,然后直接拿过来用就行了。因为我项目上传的图片是要按年月日自动生成目录来存放的,所以官方提供的那段代码是非常不够用的。

maven坐标是:

<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>4.2</version>
</dependency>

一般在真实项目中只导入这个是不行的,还需要加入http的jar包,所以还需要:而且这个版本还要匹配,否则在本地localhost的时候是可以用的,但是一道服务器上就会说你少jar包了。

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.1</version>
</dependency>

资源初始化:

// 设置用户属性, 包括appid, secretId和SecretKey
// 这些属性可以通过cos控制台获取(https://console.qcloud.com/cos)
long appId = 1000000;
String secretId = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
String secretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
// 设置要操作的bucket
String bucketName = "xxxxxxxxx";
// 初始化客户端配置
ClientConfig clientConfig = new ClientConfig();
// 设置bucket所在的区域,比如广州(gz), 天津(tj)
clientConfig.setRegion("gz");
// 初始化秘钥信息
Credentials cred = new Credentials(appId, secretId, secretKey);
// 初始化cosClient
COSClient cosClient = new COSClient(clientConfig, cred);

我只使用了其中的文件上传功能:

// 1. 上传文件(默认不覆盖)
// 将本地的local_file_1.txt上传到bucket下的根分区下,并命名为sample_file.txt
// 默认不覆盖, 如果cos上已有文件, 则返回错误
String cosFilePath = "/sample_file.txt";
String localFilePath1 = "src/test/resources/bigfile.txt";
UploadFileRequest uploadFileRequest =
new UploadFileRequest(bucketName, cosFilePath, localFilePath1);
uploadFileRequest.setEnableSavePoint(false);
uploadFileRequest.setEnableShaDigest(false);
String uploadFileRet = cosClient.uploadFile(uploadFileRequest);
System.out.println("upload file ret:" + uploadFileRet);

这段代码只是一个入门程序,所以在我们实际应用中肯定是需要进行修改的。例如我图片上传的吧,进来的是一个二进制流文件,总不能用String来接收吧,所以我将其改变了一下:

我传进去的是一个MultipartFile。所以接收我需要一个byte[].非常方便就改好了。

MultipartFile uploadFile

 // 1. 上传文件(默认不覆盖)
// 将本地的local_file_1.txt上传到bucket下的根分区下,并命名为sample_file.txt
// 默认不覆盖, 如果cos上已有文件, 则返回错误
String cosFilePath = "/images"+imagePath+"/"+newName;
byte[] localFilePath1 = uploadFile.getBytes();
UploadFileRequest uploadFileRequest =
new UploadFileRequest(bucketName, cosFilePath, localFilePath1);
uploadFileRequest.setEnableSavePoint(false);
uploadFileRequest.setEnableShaDigest(false);
String uploadFileRet = cosClient.uploadFile(uploadFileRequest);

那么我需要按年月日来生成目录,所以我需要这样。

// 生成一个新的文件
// 取原始文件名
String oldName = uploadFile.getOriginalFilename();
// 生成新文件名
// UUID.randomUUID();
String newName = IDUtils.genImageName();
newName = newName + oldName.substring(oldName.lastIndexOf("."));
// 图片上传
String imagePath = new DateTime().toString("/yyyy/MM/dd");

所以完整代码就如下了:

@Override
public Map uploadPicture(MultipartFile uploadFile) {
Map resultMap = new HashMap(); try {
// 生成一个新的文件
// 取原始文件名
String oldName = uploadFile.getOriginalFilename();
// 生成新文件名
// UUID.randomUUID();
String newName = IDUtils.genImageName();
newName = newName + oldName.substring(oldName.lastIndexOf("."));
// 图片上传
String imagePath = new DateTime().toString("/yyyy/MM/dd"); // 设置用户属性, 包括appid, secretId和SecretKey
// 这些属性可以通过cos控制台获取(https://console.qcloud.com/cos)
long appId = 1000000;
        String secretId = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
        String secretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
        // 设置要操作的bucket
        String bucketName = "xxxxxxxxx";
// 初始化客户端配置
ClientConfig clientConfig = new ClientConfig();
// 设置bucket所在的区域,比如广州(gz), 天津(tj)
clientConfig.setRegion("gz");
// 初始化秘钥信息
Credentials cred = new Credentials(appId, secretId, secretKey);
// 初始化cosClient
COSClient cosClient = new COSClient(clientConfig, cred);
///////////////////////////////////////////////////////////////
// 文件操作 //
///////////////////////////////////////////////////////////////
// 1. 上传文件(默认不覆盖)
// 将本地的local_file_1.txt上传到bucket下的根分区下,并命名为sample_file.txt
// 默认不覆盖, 如果cos上已有文件, 则返回错误
String cosFilePath = "/images"+imagePath+"/"+newName;
byte[] localFilePath1 = uploadFile.getBytes();
UploadFileRequest uploadFileRequest =
new UploadFileRequest(bucketName, cosFilePath, localFilePath1);
uploadFileRequest.setEnableSavePoint(false);
uploadFileRequest.setEnableShaDigest(false);
String uploadFileRet = cosClient.uploadFile(uploadFileRequest); //System.out.println("upload file ret:" + uploadFileRet); String json=JsonUtils.objectToJson(uploadFileRet);
//System.out.println(json.toString()); resultMap.put("error", 0);
resultMap.put("url", IMAGE_BASE_URL +"/images"+imagePath+"/"+newName); return resultMap;
} catch (Exception e) {
resultMap.put("error", 1);
resultMap.put("message", "文件上传发生异常");
return resultMap;
}
}

这个IMAGE_BASE_URL就是这个对象存储的位置。例如你随便上传一个文件的时候,都会给你一个文件的地址的前缀部分。

完成之后可以在控制台查看,或者网址访问,如果需要图片的时候,就把这个url拿出用即可,例如我就是放在img标签的src里就可以直接使用了。

前面的工具类IDUtils.java

public class IDUtils {

	/**
* 图片名生成
*/
public static String genImageName() {
//取当前时间的长整形值包含毫秒
long millis = System.currentTimeMillis();
//long millis = System.nanoTime();
//加上三位随机数
Random random = new Random();
int end3 = random.nextInt(999);
//如果不足三位前面补0
String str = millis + String.format("%03d", end3); return str;
}
}

总结:使用对象存储服务是一种非常高效便捷的方式,而且使用起来还是挺简单的。点个赞。

COS对象存储服务的使用的更多相关文章

  1. Go操作腾讯云COS对象存储的简单使用案例

    准备环境 安装Go环境 Golang:用于下载和安装 Go 编译运行环境,请前往 Golang 官网进行下载 安装SDK go get -u github.com/tencentyun/cos-go- ...

  2. 腾讯云COS对象存储 Web 端直传实践(JAVA实现)

    使用 腾讯云COS对象存储做第三方存储云服务,把一些文件都放在上面,这里主要有三中实现方式:第一种就是在控制台去设置好,直接上传文件.第二种就是走服务端,上传文件,就是说,上传文件是从服务端去上传上去 ...

  3. 腾讯云COS对象存储占据数据容灾C位

    说到公有云容灾,大家首先想到的是云上数据备份. 然而,随着企业核心业务逐渐从线下迁移到云上,客户提出了更高的要求.如何确保云上业务的高可用.数据的高可靠,这对云厂商提出了新的挑战. 腾讯云作为全球领先 ...

  4. 使用 HDFS 协议访问对象存储服务

    背景介绍 原生对象存储服务的索引是扁平化的组织形式,在传统文件语义下的 List 和 Rename 操作性能表现上存在短板.腾讯云对象存储服务 COS 通过元数据加速功能,为上层计算业务提供了等效于 ...

  5. 对象存储服务(Object Storage Service,简称 OSS)

    阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.它具有与平台无关的RESTful API接口,能够提供99.99 ...

  6. 轻量对象存储服务——minio

    minio Minio是一个非常轻量的对象存储服务. Github: minio 它本身不支持文件的版本管理.如果有这个需求,可以用 s3git 搭配使用. Github: s3git 安装 mini ...

  7. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 四

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  8. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 三

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  9. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 二

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

随机推荐

  1. laydate 日期格式为yyyy 或yyyy-MM时,出现错误Uncaught TypeError: Cannot read property 'length' of undefined

    这个改起比较麻烦,没有深究,简单兼容了yyyy 和yyyy-MM,其他格式可能还是会有错误.替换Dates.check方法. //检测日期是否合法 Dates.check = function(){ ...

  2. VINS 估计器之检查视差

    为什么检查视差 VINS里为了控制优化计算量,在实时情况下,只对当前帧之前某一部分帧进行优化,而不是全部历史帧.局部优化帧的数量就是窗口大小.为了维持窗口大小,需要去除旧的帧添加新的帧,也就是边缘化 ...

  3. drupal8的安装

    一.首先安装好linux系统虚拟机 1.在drupal官网上下载drupal包,https://www.drupal.org/download 我下载的是 https://ftp.drupal.org ...

  4. XML 解析默认去掉命名空间和注释

    //创建xml文档 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(@"C:\Users\Tony\Downloads\统一标准报文格 ...

  5. 虚拟机工作站创建虚拟机并安装Linux教程

    前言: 今天开始学习一下Linux,之前早就想看,但是一直没时间,最近把其他知识整理完了,终于有时间来看一下Linux了. 本节只是安装虚拟机工作站,虚拟机,和Linux操作系统的过程,详细的记录了我 ...

  6. JS基本数据类型(typeof的返回结果)

    number(Infinity/NaN) string boolean function object(null.各种值装箱对象.内置对象.自定义对象) undefined 判断对象是否为某个[类/构 ...

  7. [CQOI 2015]选数

    Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...

  8. Go学习——defer、panic

    defer: 延迟到ret之前,通常用于IO的关闭 or 错误处理. 在延迟出现的异常可以被后面的捕捉,但是只有最后一个. defer可以多次,这样形成一个defer栈,后defer的语句在函数返回时 ...

  9. 洛谷P2572 [SCOI2010]序列操作

    线段树 pushdown写的很浪~ #include<cstdio> #include<cstdlib> #include<algorithm> #include& ...

  10. NOIP 2014

    Prob.1 生活大爆炸版 石头剪刀布 模拟.代码: #include<cstdio> #include<cstring> #include<iostream> u ...