package com.sandu.common.file.impl; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.UUID; 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.HttpProtocol; import com.qcloud.cos.model.PutObjectRequest; import com.qcloud.cos.model.PutObjectResult; import com.qcloud.cos.region.Region; import com.sandu.common.enums.FileStorageEnums; import com.sandu.common.file.FileUploadDto; import com.sandu.common.file.IFileUpload; import com.sandu.common.file.config.TencentOssProperties; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; /** * @author chenjiantian * @date 2020/12/17 15:31 */ @Service @Slf4j @RequiredArgsConstructor public class TencentOssFileServiceImpl implements IFileUpload { private TencentOssProperties properties; @SneakyThrows @Override public FileUploadDto uploadFile(MultipartFile multipartFile) { String originalFilename = multipartFile.getOriginalFilename(); long size = multipartFile.getSize(); String suffix = FileUtil.getSuffix(originalFilename); String fileName = UUID.fastUUID().toString() + "." + suffix; FileUploadDto uploadDto = new FileUploadDto(); COSCredentials cred = new BasicCOSCredentials(properties.getSecretId(), properties.getSecretKey()); // 2 设置 bucket 的地域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224 // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。 Region region = new Region("COS_REGION"); ClientConfig clientConfig = new ClientConfig(region); // 这里建议设置使用 https 协议 // 从 5.6.54 版本开始,默认使用了 https clientConfig.setHttpProtocol(HttpProtocol.https); // 3 生成 cos 客户端。 COSClient cosClient = new COSClient(cred, clientConfig); // 指定文件上传到 COS 上的路径,即对象键。例如对象键为folder/picture.jpg,则表示将文件 picture.jpg 上传到 folder 路径下 PutObjectRequest putObjectRequest = new PutObjectRequest(properties.getBucketName(), fileName, multipartFile.getInputStream(), null); PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest); uploadDto.setFileUrl(properties.getWebUrl() + "/" + fileName); uploadDto.setOriginName(originalFilename); uploadDto.setFileName(fileName); uploadDto.setFileType(FileUtil.extName(originalFilename)); uploadDto.setStorageType(FileStorageEnums.TENCENT.getCode()); uploadDto.setFileSize(size); if (IMAGE_SUFFIX_LIST.contains(uploadDto.getFileType())) { BufferedImage img = null; try { img = ImageIO.read(multipartFile.getInputStream()); } catch (IOException e) { e.printStackTrace(); } if (img != null && img.getWidth() >= 0 && img.getHeight() >= 0) { uploadDto.setWidth(img.getWidth()); uploadDto.setHeight(img.getHeight()); } } return uploadDto; } }