参考:
(1)预签名 URL: https://cloud.tencent.com/document/product/436/35217
(2)vue 调用put直接上传文件:https://blog.csdn.net/lht_521/article/details/108964591
我:
(1)pom引入
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.38</version>
</dependency>
(2)工具类
package com.base.utils;
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.http.HttpMethodName;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.GeneratePresignedUrlRequest;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.region.Region;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
/**
* @author 吴桂鑫
* @Description 腾讯云-对象存储 工具类
*/
public class QCloudUtils
{
// 存储桶的命名格式必须为 BucketName-APPID
private static final String BUCKET_NAME = "BucketName-APPID";
// 密钥ID
private static final String SECRET_ID = "SECRET_ID";
// 密钥KEY
private static final String SECRET_KEY = "SECRET_KEY";
// Region
private static final String REGION_NAME = "REGION_NAME";
// basePicUrl
private static final String BASE_FILE_URL = "BASE_FILE_URL";
// 生成 cos 客户端
private static COSClient getCOSClient() {
// 1 初始化用户身份信息(secretId, secretKey)
COSCredentials cred = new BasicCOSCredentials(SECRET_ID, SECRET_KEY);
// 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
Region region = new Region(REGION_NAME);
ClientConfig clientConfig = new ClientConfig(region);
// 3 这里建议设置使用 https 协议
clientConfig.setHttpProtocol(HttpProtocol.https);
// 4 生成 cos 客户端
COSClient cosClient = new COSClient(cred, clientConfig);
return cosClient;
}
/**
* 生成带签名的 预下载链接
* @param key 文件名称
*/
public static String getPreDownLoadUrl(String key) {
COSClient cosClient = getCOSClient();
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(BUCKET_NAME, key, HttpMethodName.GET);
// 设置签名过期时间(可选), 若未进行设置, 则默认使用 ClientConfig 中的签名过期时间(1小时)
// 这里设置签名在半个小时后过期
Date expirationDate = new Date(System.currentTimeMillis() + 30 * 60 * 1000L);
req.setExpiration(expirationDate);
URL url = cosClient.generatePresignedUrl(req);
String downLUrl = url.toString();
cosClient.shutdown();
return downLUrl;
}
/**
* 生成带签名的 预上传链接,可直接发给客户端进行文件的上传
* @param key
*/
public static String getPreUploadUrl(String key) {
COSClient cosClient = getCOSClient();
//设置签名过期时间(可选), 若未进行设置, 则默认使用 ClientConfig 中的签名过期时间(1小时)
Date expirationTime = new Date(System.currentTimeMillis() + 30L * 60L * 1000L);
URL url = cosClient.generatePresignedUrl(BUCKET_NAME, key, expirationTime, HttpMethodName.PUT);
cosClient.shutdown();
return url.toString();
}
/**
* 小文件上传
* @param mf
*/
public static void upoload(MultipartFile mf, String key) throws Exception{
InputStream inputStream=null;
COSClient cosClient=null;
try{
inputStream = mf.getInputStream();
cosClient = getCOSClient();
PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME,key,inputStream,null);
getCOSClient().putObject(putObjectRequest);
}finally {
if(cosClient!=null) {
cosClient.shutdown();
}
if(inputStream!=null) {
inputStream.close();
}
}
}
/**
* 判断网络给定地址图片是否存在
* @param key
*/
public static URL getUrl(String key) {
try {
URL url = new URL(BASE_FILE_URL + key);
URLConnection uc = url.openConnection();
InputStream in = uc.getInputStream();
if (key.equalsIgnoreCase(uc.getURL().toString()))
in.close();
return url;
} catch (Exception e) {
return null;
}
}
public static void main(String[] args)
{
getPreUploadUrl("test.mp3");
}
}
(3)vue页面调用put直接上传文件
uploadCos(file) {
return request({
url: '/xxx/xxxx',
data: file,
method: 'put',
headers: {'Content-Type':'binary'}
})
}