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