個人博客上已經同步更新了文章,有目錄索引,閱讀起來比較方便,歡迎大家移步個人博客上讀閱~
個人博客地址:http://zwd596257180.gitee.io/blog/2019/06/11/tengxunyuncos/
一、jar 包
<!-- JSONObject 需要導入的包 -->
<dependency>
<groupId>org.apache.clerezza.ext</groupId>
<artifactId>org.json.simple</artifactId>
<version>0.4</version>
</dependency>
<!-- 文件上傳 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 騰訊雲COS 需要依賴的 jar 包 -->
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.2.4</version>
</dependency>
二、自定義工具類 COSConfig.java
該工具類是用來存放申請到的騰訊雲對象存儲COS的相關信息,關於這些信息如何獲取請看博客後面第七點。
package com.utils;
//騰訊雲COS對象存儲常量
public class COSConfig {
//secretId
public static final String SECRETID = "AKIDfO0Zz*************************";
//secretKey
public static final String SECRETKEY = "b1Jzp9Y****************************";
//bucket的區域, COS地域的簡稱請參照 https://www.qcloud.com/document/product/436/6224
public static final String REGION = "ap-guangzhou";
// bucket名需包含appid
public static final String BUCKETNAME = "hstc-image-125********";
}
三、自定義工具類 DateConvent.java
DateConvent.java 是自己寫的一個類型轉換工具類。
package com.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
//轉換時間的工具類
public class DateConvert {
public String toString(Date date) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String time = simpleDateFormat.format(date);
return time;
}
}
四、圖片上傳和刪除工具類 ImageHandle.java
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.exception.MultiObjectDeleteException;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
public class ImageHandle {
private static final Logger logger = LoggerFactory.getLogger(ImageHandle.class);
/**
* 上傳圖片
* @param file
* @return
* @throws IOException
*/
public static String uploadImageToCos(MultipartFile file) throws IOException {
if (file != null) {
// 獲取文件內容類型
String contentType = file.getContentType();
// 獲取上傳文件的文件流
InputStream inputStream = file.getInputStream();
// 獲取文件的字節數
long size = file.getSize();
// 判斷文件是否爲空
if (size != 0) {
// 初始化用戶身份信息(secretId, secretKey)
// secretId,secretKey 是騰訊 COS 的一個賬號和密碼
COSCredentials cred = new BasicCOSCredentials(COSConfig.SECRETID, COSConfig.SECRETKEY);
// 設置bucket的區域, COS地域的簡稱,請參照:
// https://www.qcloud.com/document/product/436/6224
ClientConfig clientConfig = new ClientConfig(new Region(COSConfig.REGION));
// 生成cos客戶端
COSClient cosclient = new COSClient(cred, clientConfig);
// bucket名需包含appid
String bucketName = COSConfig.BUCKETNAME;
//獲取後綴名
String[] split = contentType.split("/");
//文件名
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//當前日期
Date date = new Date();
DateConvert util = new DateConvert();
String dd = util.toString(date);
//目標文件名
String key = "/hanshi" + "/" + dd + "/" + uuid + "." + split[1];
String imgName = key.substring(1);
ObjectMetadata objectMetadata = new ObjectMetadata();
// 從輸入流上傳必須制定content length
// 否則http客戶端可能會緩存所有數據,存在內存OOM的情況
objectMetadata.setContentLength(size);
// 默認下載時根據cos路徑key的後綴返回響應的contenttype
// 上傳時設置contenttype會覆蓋默認值
objectMetadata.setContentType(contentType);
PutObjectRequest putObjectRequest =
new PutObjectRequest(bucketName, key, inputStream, objectMetadata);
// 設置存儲類型, 默認是標準(Standard), 低頻(standard_ia), 近線(nearline)
putObjectRequest.setStorageClass(StorageClass.Standard);
try {
//將圖片上傳到 COS
cosclient.putObject(putObjectRequest);
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
}
// 關閉客戶端
cosclient.shutdown();
// 返回的只是圖片在COS中存儲的路徑,在線返回COS的鏈接需要自己拼接上
//比如:"https://hstc-image-1254334144.cos.ap-guangzhou.myqcloud.com/"+imgName
return imgName;
}
}
return "";
}
/**
* 刪除圖片(不帶版本號, 即bucket未開啓多版本)
* @param imgName
* @return
*/
public static Boolean deleteImageFromCos(String imgName){
// 初始化用戶身份信息(secretId, secretKey)
COSCredentials cred = new BasicCOSCredentials(COSConfig.SECRETID, COSConfig.SECRETKEY);
// 設置bucket的區域, COS地域的簡稱請參照 https://www.qcloud.com/document/product/436/6224
ClientConfig clientConfig = new ClientConfig(new Region(COSConfig.REGION));
// 生成cos客戶端
COSClient cosclient = new COSClient(cred, clientConfig);
// bucket名需包含appid
String bucketName = COSConfig.BUCKETNAME;
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName);
// 設置要刪除的key列表, 最多一次刪除1000個
ArrayList<DeleteObjectsRequest.KeyVersion> keyList = new ArrayList<>();
// 傳入要刪除的文件名
keyList.add(new DeleteObjectsRequest.KeyVersion(imgName));
//============================================
//如果一次性刪除多張圖片的話,可以把傳入的參數改爲 List,再循環賦值給 keyList
//keyList.add(new KeyVersion("2018-04-19/99440ec2800e4a3baef9e84c662a546d.plain"));
//keyList.add(new KeyVersion("2018-04-18/4b566aef3b5d4b28bd12d6e32a72dad9.jpeg"));
//keyList.add(new KeyVersion("2018-04-18/tttt"));
//============================================
deleteObjectsRequest.setKeys(keyList);
// 批量刪除文件
try {
DeleteObjectsResult deleteObjectsResult = cosclient.deleteObjects(deleteObjectsRequest);
List<DeleteObjectsResult.DeletedObject> deleteObjectResultArray = deleteObjectsResult.getDeletedObjects();
} catch (MultiObjectDeleteException mde) { // 如果部分產出成功部分失敗,
// 返回MultiObjectDeleteException
List<DeleteObjectsResult.DeletedObject> deleteObjects = mde.getDeletedObjects();
List<MultiObjectDeleteException.DeleteError> deleteErrors = mde.getErrors();
// 關閉客戶端
cosclient.shutdown();
return false;
} catch (CosServiceException e) { // 如果是其他錯誤, 比如參數錯誤,
// 身份驗證不過等會拋出CosServiceException
logger.error("參數錯誤");
e.printStackTrace();
// 關閉客戶端
cosclient.shutdown();
return false;
} catch (CosClientException e) { // 如果是客戶端錯誤,比如連接不上COS
logger.error("客戶端錯誤,比如連接不上COS");
e.printStackTrace();
// 關閉客戶端
cosclient.shutdown();
return false;
}
// 關閉客戶端
cosclient.shutdown();
return true;
}
}
五、Controller 編程
上面已經把圖片上傳和刪除分別封裝成一個靜態方法,所以只需要直接調用即可。
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
@RequestMapping(value = "/insertrecruitmentinfo")
@ResponseBody
public String add(MultipartFile file,HttpServletRequest request) throws IOException {
/*前端 UI 的 form 表單裏面有用到圖片上傳的時候,需要在這裏對 request 作以下處理*/
// MultipartHttpServletRequest mulRequest = (MultipartHttpServletRequest) request;
// String title = mulRequest.getParameter("title");//獲取標題
// ... ...
//判空
if( file != null ){
//將圖片上傳成功後的返回鏈接返回
String litimg = ImageHandle.uploadImageToCos(file);
... ...
}
}
六、前端編程
後臺 controller 使用 MultipartFile 接收文件,需要在 form 表單加上這個屬性:enctype=“multipart/form-data”。
<form action="#" enctype="multipart/form-data" >
... ...
<input type="file" name="file" id="picID" accept="image/gif,image/jpeg,image/x-png"/>
... ...
</form>
七、創建騰訊雲COS
1、進入自己騰訊雲服務器的控制檯,打開對象存儲。
2、創建存儲桶
3、填寫存儲桶相關信息
4、查看基本配置
5、SECRETID 和 SECRETKEY 的獲取
https://console.qcloud.com/cam/capi
打開上面的鏈接,登錄進去,就能找到了,如下圖:
如果第一次沒有,就自己新建一個密鑰。
八、批量上傳圖片
下面只是一個大概的邏輯代碼,可根據自己需要修改。同時也需要配合前面的單張圖片上傳使用。
public void uploadPictureList1(MultipartFile[] file){
List<String> list = null;
int code=1;
if (file!=null && file.length>0) {
try {
list = new ArrayList<String> ();
for (int i = 0; i < file.length; i++) {
// 通過循環獲取單張圖片 file[i] ,然後一張一張上傳
String upload = uploadImageToCos(file[i]);
list.add(upload);
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 將上傳後所有圖片鏈接拼接起來,用逗號分開
String imgName ="";
int index = 0;
for(String str : list) {
if(index != 0 ) {
imgName += ",";
}
imgName += str;
index++;
}
}