1、首先去腾讯云cos官网注册账号,选择【对象存储】;
2、接下来创建【存储桶】,【存储桶】的意思类似于单独的服务器空间,只有创建了存储桶才能存储资源;
3、系统会根据存储桶的名称 自动生成一个独有的域名;
4、存储空间搞定了,接下来就是从本地上传图片到云服务器了;同时腾讯云也提供了SDK文档和API文档,供我们借鉴,还是相当清楚的;
5、上传图片代码,需要注意的是区域,要和服务器上存储桶列表的【所属区域】字段一致;
package com.cos.web;
import java.io.File;
import java.net.URL;
import java.util.Date;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import com.qcloud.cos.model.StorageClass;
import com.qcloud.cos.region.Region;
public class Upload {
public static void main(String[] args) {
// 1 初始化用户身份信息API密钥(secretId, secretKey)
COSCredentials cred = new BasicCOSCredentials("AKIDXuxxx", "71f4FEyWxxx");
// 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing"));
// 3 生成cos客户端
COSClient cosclient = new COSClient(cred, clientConfig);
// 存储桶bucket名需包含appid
String bucketName = "demo-1258118289";
// 指定要上传到 COS 上对象键
// 对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名 `bucket1-1250000000.cos.ap-guangzhou.myqcloud.com/doc1/pic1.jpg` 中,对象键为 doc1/pic1.jpg, 详情参考 [对象键](https://cloud.tencent.com/document/product/436/13324)
String key = "2.png";
File localFile = new File("src/main/resources/2.png");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
// 设置存储类型, 默认是标准(Standard), 低频(standard_ia)
putObjectRequest.setStorageClass(StorageClass.Standard_IA);
try {
PutObjectResult putObjectResult = cosclient.putObject(putObjectRequest);
Date expiration = new Date(new Date().getTime() + 5 * 60 * 10000);
URL url = cosclient.generatePresignedUrl(bucketName, key, expiration);
System.out.println("图片在COS服务器上的url:"+url);
// putobjectResult会返回文件的etag
String etag = putObjectResult.getETag();
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
}
// 关闭客户端
cosclient.shutdown();
}
}
6、下载图片的代码
package com.cos.web;
import java.io.File;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.model.GetObjectRequest;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import com.qcloud.cos.model.StorageClass;
import com.qcloud.cos.region.Region;
public class Download {
public static void main(String[] args) {
// 1 初始化用户身份信息(secretId, secretKey)
COSCredentials cred = new BasicCOSCredentials("AKIDXu20jxxxxx","71f4FEyWxxxx");
// 2 设置bucket的区域, COS地域的简称请参照
// https://cloud.tencent.com/document/product/436/6224
ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing"));
// 3 生成cos客户端
COSClient cosclient = new COSClient(cred, clientConfig);
// bucket名需包含appid
String bucketName = "demo-1258118289";
// 对象键(Key)是对象在存储桶中的唯一标识。例如,在对象的访问域名 `bucket1-1250000000.cos.ap-guangzhou.myqcloud.com/doc1/pic1.jpg` 中,对象键为 doc1/pic1.jpg, 详情参考 [对象键](https://cloud.tencent.com/document/product/436/13324)
String key = "1.png";
File downFile = new File("src/main/resources/2.png");
// 指定要下载的文件所在的 bucket 和对象键
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
try {
ObjectMetadata downObjectMeta = cosclient.getObject(getObjectRequest, downFile);
// putobjectResult会返回etag
String etag = downObjectMeta.getETag();
System.out.println(etag);
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
}
// 关闭客户端
cosclient.shutdown();
}
}
附(图片上传腾讯云cos工具类):
public class COSClientUtil {
private static final String SECRETID = "AKIDU4T6iUPu8ixxx";
private static final String SECRETKEY = "gBUbVDj6HJxxx";
private static final String APPID = "1252337xxx";
private static final String BUCKETNAME = "claim" + "-" + APPID; // 桶的名称
private static final String REGIONID = "ap-shanghai";// 区域
private static final String KEY = "ClaimPic/";
private static final String host = "https://" + BUCKETNAME + ".cossh.myqcloud.com";
/**
* * 初始化CosClient相关配置, appid、accessKey、secretKey、region * @return
*/
public static COSClient getCosClient() {
// 1 init userInfo (secretId, secretKey)
// COSCredentials cred = new BasicCOSCredentials(APPID,ACCESSKEY,
// SECRETKEY);
COSCredentials cred = new BasicCOSCredentials(SECRETID, SECRETKEY); // 不传APPID也可以,APPID和ACCESSKE已经关联过
// 2 set bucket region
ClientConfig clientConfig = new ClientConfig(new Region(REGIONID));
// 3 init cosclient
COSClient cosclient = new COSClient(cred, clientConfig);
// bucket name protocol must be {name}-{appid}
return cosclient;
}
/**
* 上传文件
*
* @return
*/
public static String uploadFile(String fileURL, String fileName) {
InputStream inputStream = null;
ByteArrayOutputStream output = new ByteArrayOutputStream();
if (fileURL.startsWith("http") || fileURL.startsWith("https")) {
try {
URL url = new URL(fileURL);
inputStream = url.openStream();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
try {
inputStream = new FileInputStream(fileURL);
} catch (FileNotFoundException e) {
e.printStackTrace();
} // 绝对路径和相对路径都OK
}
try {
IOUtils.copy(inputStream, output);
} catch (IOException e2) {
e2.printStackTrace();
}
return uploadFile(output.toByteArray(), fileName);
}
public static String uploadFile(byte[] bytes, String fileName) {
String backUrl = "";
// String bucket = BUCKETNAME + "-" + APPID;
// String bucket="claim-1252337168";
System.out.println(BUCKETNAME);
String key = KEY + fileName;
ObjectMetadata metadata = new ObjectMetadata();
// metadata.setContentType("image/jpeg");
metadata.setContentLength(bytes.length);
PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, key, new ByteArrayInputStream(bytes),
metadata);
// 设置存储类型, 默认是标准(Standard), 低频(standard_ia)
putObjectRequest.setStorageClass(StorageClass.Standard_IA);
COSClient cc = getCosClient();
try {
PutObjectResult putObjectResult = cc.putObject(putObjectRequest);
// putobjectResult会返回文件的etag
backUrl = host + "/" + key;
System.out.println(backUrl);
return backUrl;
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
}
// 关闭客户端
cc.shutdown();
return backUrl;
}
public static String uploadFile(ByteArrayInputStream input, String fileName) {
byte[] bytes = null;
try {
bytes = IOUtils.toByteArray(input);
} catch (IOException e) {
e.printStackTrace();
}
return uploadFile(bytes, fileName);
}
/**
* * 下载文件 * @param bucketName * @param key * @return
*/
public static String downLoadFile(String bucketName, String key) {
File downFile = new File("D:/downloadTest/" + KEY + "czy_test.png");
COSClient cc = getCosClient();
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
ObjectMetadata downObjectMeta = cc.getObject(getObjectRequest, downFile);
cc.shutdown();
String etag = downObjectMeta.getETag();
return etag;
}
/**
* * 删除文件 * @param bucketName * @param key
*/
public void deleteFile(String bucketName, String key) {
COSClient cc = getCosClient();
try {
cc.deleteObject(bucketName, key);
} catch (CosClientException e) {
e.printStackTrace();
} finally {
cc.shutdown();
}
}
/**
* * 判断桶是否存在 * @param bucketName * @return * @throws CosClientException
* * @throws CosServiceException
*/
public static boolean doesBucketExist(String bucketName) throws CosClientException, CosServiceException {
COSClient cc = getCosClient();
boolean bucketExistFlag = cc.doesBucketExist(bucketName);
return bucketExistFlag;
}
/**
* * 查看桶文件 * @param bucketName * @return * @throws CosClientException
* * @throws CosServiceException
*/
public ObjectListing listObjects(String bucketName) throws CosClientException, CosServiceException {
COSClient cc = getCosClient();
// 获取 bucket 下成员(设置 delimiter)
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.setBucketName(bucketName);
// 设置 list 的 prefix, 表示 list 出来的文件 key 都是以这个 prefix 开始
listObjectsRequest.setPrefix("");
// 设置 delimiter 为/, 即获取的是直接成员,不包含目录下的递归子成员
listObjectsRequest.setDelimiter("/");
// 设置 marker, (marker 由上一次 list 获取到, 或者第一次 list marker 为空)
listObjectsRequest.setMarker("");
// 设置最多 list 100 个成员,(如果不设置, 默认为 1000 个,最大允许一次 list 1000 个 key)
listObjectsRequest.setMaxKeys(100);
ObjectListing objectListing = cc.listObjects(listObjectsRequest);
// 获取下次 list 的 marker
String nextMarker = objectListing.getNextMarker();
// 判断是否已经 list 完, 如果 list 结束, 则 isTruncated 为 false, 否则为 true
boolean isTruncated = objectListing.isTruncated();
List<COSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
for (COSObjectSummary cosObjectSummary : objectSummaries) {
// get file path
String key = cosObjectSummary.getKey();
// get file length
long fileSize = cosObjectSummary.getSize();
// get file etag
String eTag = cosObjectSummary.getETag();
// get last modify time
Date lastModified = cosObjectSummary.getLastModified();
// get file save type
String StorageClassStr = cosObjectSummary.getStorageClass();
}
return objectListing;
}
public static InputStream getImageStream(String url) {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream inputStream = connection.getInputStream();
System.out.println("进入图片获取***" + inputStream);
return inputStream;
}
} catch (IOException e) {
System.out.println("获取网络图片出现异常,图片路径为:" + url);
e.printStackTrace();
}
return null;
}
private static byte[] readBytes(InputStream is) throws Exception {
if ((is == null) || (is.available() < 1)) {
return new byte[0];
}
byte[] buff = new byte[8192];
byte[] result = new byte[is.available()];
BufferedInputStream in = new BufferedInputStream(is);
int pos = 0;
int nch;
while ((nch = in.read(buff, 0, buff.length)) != -1) {
// int nch;
pos += nch;
}
System.out.println("byte长度为:" + result.length);
in.close();
return result;
}
/**
* 获取网络文件的输入流
*
* @param urlStr
* @return
*/
public static InputStream getInputStreamByUrl(String urlStr) {
DataInputStream in = null;
try {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
in = new DataInputStream(conn.getInputStream());
} catch (IOException e) {
}
System.out.println("转换完成" + in);
return in;
}
public static byte[] toByteArray(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
int n = 0;
while ((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
}
return out.toByteArray();
}
}
ps:
1 初始化用户身份信息(secretId, secretKey),在【密钥管理】里面;
2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224