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;
|
}
|
}
|