Spring Boot项目对接腾讯云COS对象存储上传文件接口

发布时间 2023-05-09 13:58:57作者: -西门-

Spring Boot项目对接腾讯云COS对象存储上传文件接口

pom.xml

<dependency>
    <groupId>com.qcloud</groupId>
    <artifactId>cos_api</artifactId>
    <version>5.6.35</version>
</dependency>

application.yml

cos:
  secretId: xxx
  secretKey: xxx
  bucketName: xxx-yyy #存储桶名称,格式一般是xxx-appId,比如cocktail-1300110000
  region: ap-xxx #地区,格式一般是ap-地区,比如上海:ap-shanghai

Service

import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * 腾讯云对象存储cos服务类
 * @author Siemen_Xie
 */
public interface CosService {

    /**
     * 腾讯云对象存储上传图片
     * @param file 图片文件
     * @return 图片url
     */
    String uploadFile(MultipartFile file) throws IOException;
}

ServiceImpl

import cn.hutool.core.date.DateUtil;
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.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.region.Region;
import com.ximen.cocktailserver.service.CosService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.Date;
import java.util.UUID;

/**
 * @author Siemen_Xie
 */
@Service
public class CosServiceImpl implements CosService {

    @Value("${cos.secretId}")
    private String secretId;
    @Value("${cos.secretKey}")
    private String secretKey;
    @Value("${cos.bucketName}")
    private String bucketName;
    @Value("${cos.region}")
    private String region;

    /**
     * 上传文件到腾讯云cos
     *
     * @param file 上传的文件
     * @return 文件在cos上的访问url
     */
    @Override
    public String uploadFile(MultipartFile file) throws IOException {
//        if (file.getSize() <= 0) {
//            throw new RuntimeException("上传的文件大小不能为空");
//        }
//        if (file.getSize() > 20 * 1024 * 1024) {
//            throw new RuntimeException("上传的文件大小不能超过20MB");
//        }
//        if (!file.getContentType().startsWith("image")) {
//            throw new RuntimeException("上传的文件不是图片类型");
//        }
        // 初始化cos客户端
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        ClientConfig clientConfig = new ClientConfig(new Region(region));
        COSClient cosClient = new COSClient(cred, clientConfig);
        try {
            String oldName = file.getOriginalFilename();
            String suffix = oldName.substring(oldName.lastIndexOf(".") + 1);
            // 生成唯一文件名,当前时间 + 随机UUID + 文件类型
            String fileName = DateUtil.format(new Date(), "yyyyMMddHHmmss") + "-" + UUID.randomUUID() + "." + suffix;
            // 上传文件到cos
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.getSize());
            InputStream inputStream = file.getInputStream();
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream, metadata);
            cosClient.putObject(putObjectRequest);
            inputStream.close();
            // 返回文件在cos上的访问url
            return "https://" + bucketName + ".cos." + region + ".myqcloud.com/" + fileName;
        } catch (IOException e) {
            throw new RuntimeException("上传失败");
        } finally {
            // 关闭cos客户端
            cosClient.shutdown();
        }
    }
}

Controller

import com.ximen.cocktailserver.service.CosService;
import com.ximen.cocktailserver.utils.RestResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;

/**
 * 公共服务接口
 * @author Siemen_Xie
 */
@RestController
@RequestMapping("/api")
@Slf4j
public class PublicController {

    @Resource
    private CosService cosService;

    @PostMapping("/uploadFile")
    public RestResponse<String> uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
        return RestResponse.ok(cosService.uploadFile(file));
    }

}