SSM 項目如何上傳圖片到騰訊雲COS?


個人博客上已經同步更新了文章,有目錄索引,閱讀起來比較方便,歡迎大家移步個人博客上讀閱~

個人博客地址: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++;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章