diff --git a/service-client/service-driver-client/src/main/java/com/atguigu/daijia/driver/client/CosFeignClient.java b/service-client/service-driver-client/src/main/java/com/atguigu/daijia/driver/client/CosFeignClient.java index 07c8efd..a384232 100644 --- a/service-client/service-driver-client/src/main/java/com/atguigu/daijia/driver/client/CosFeignClient.java +++ b/service-client/service-driver-client/src/main/java/com/atguigu/daijia/driver/client/CosFeignClient.java @@ -12,5 +12,7 @@ import org.springframework.web.multipart.MultipartFile; @FeignClient(value = "service-driver") public interface CosFeignClient { - + // 上传文件 + @PostMapping(value = "cos/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + Result upload(@RequestPart("file") MultipartFile file, @RequestParam(name = "path", defaultValue = "auth") String path); } \ No newline at end of file diff --git a/service/service-driver/pom.xml b/service/service-driver/pom.xml index 42bfc97..9a24e43 100644 --- a/service/service-driver/pom.xml +++ b/service/service-driver/pom.xml @@ -18,6 +18,16 @@ com.github.binarywang weixin-java-miniapp + + + com.qcloud + cos_api + + + + com.tencentcloudapi + tencentcloud-sdk-java + diff --git a/service/service-driver/src/main/java/com/atguigu/daijia/driver/config/TencentCloudProperties.java b/service/service-driver/src/main/java/com/atguigu/daijia/driver/config/TencentCloudProperties.java new file mode 100644 index 0000000..6551ba2 --- /dev/null +++ b/service/service-driver/src/main/java/com/atguigu/daijia/driver/config/TencentCloudProperties.java @@ -0,0 +1,36 @@ +package com.atguigu.daijia.driver.config; + +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.region.Region; +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "tencent.cloud") +public class TencentCloudProperties { + private String secretId; + private String secretKey; + private String region; + private String bucketPrivate; + + private String persionGroupId; + + @Bean + public COSClient getCosClient() { + COSCredentials cred = new BasicCOSCredentials(secretId, secretKey); + // 2 设置 bucket 的地域, COS 地域 + Region region = new Region(this.region); + ClientConfig clientConfig = new ClientConfig(region); + // 这里建议设置使用 https 协议 + clientConfig.setHttpProtocol(HttpProtocol.https); + // 3 生成 cos 客户端。 + return new COSClient(cred, clientConfig); + } +} \ No newline at end of file diff --git a/service/service-driver/src/main/java/com/atguigu/daijia/driver/controller/CosController.java b/service/service-driver/src/main/java/com/atguigu/daijia/driver/controller/CosController.java index 6e709a6..105929b 100644 --- a/service/service-driver/src/main/java/com/atguigu/daijia/driver/controller/CosController.java +++ b/service/service-driver/src/main/java/com/atguigu/daijia/driver/controller/CosController.java @@ -1,9 +1,14 @@ package com.atguigu.daijia.driver.controller; +import com.atguigu.daijia.common.result.Result; +import com.atguigu.daijia.driver.service.CosService; +import com.atguigu.daijia.model.vo.driver.CosUploadVo; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; @Slf4j @Tag(name = "腾讯云cos上传接口管理") @@ -11,6 +16,16 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping(value = "/cos") public class CosController { + @Autowired + private CosService cosService; + @Operation(summary = "上传") + @PostMapping("/upload") + //@GuiguLogin + public Result upload(@RequestPart("file") MultipartFile file, + @RequestParam("path") String path) { + CosUploadVo cosUploadVo = cosService.upload(file, path); + return Result.ok(cosUploadVo); + } } diff --git a/service/service-driver/src/main/java/com/atguigu/daijia/driver/service/CosService.java b/service/service-driver/src/main/java/com/atguigu/daijia/driver/service/CosService.java index fef6748..17af6c1 100644 --- a/service/service-driver/src/main/java/com/atguigu/daijia/driver/service/CosService.java +++ b/service/service-driver/src/main/java/com/atguigu/daijia/driver/service/CosService.java @@ -1,6 +1,16 @@ package com.atguigu.daijia.driver.service; +import com.atguigu.daijia.model.vo.driver.CosUploadVo; +import org.springframework.web.multipart.MultipartFile; + public interface CosService { - + /** + * 上传文件 + * + * @param file 文件 + * @param path path + * @return CosUploadVo + */ + CosUploadVo upload(MultipartFile file, String path); } diff --git a/service/service-driver/src/main/java/com/atguigu/daijia/driver/service/impl/CosServiceImpl.java b/service/service-driver/src/main/java/com/atguigu/daijia/driver/service/impl/CosServiceImpl.java index d946528..b61ac5b 100644 --- a/service/service-driver/src/main/java/com/atguigu/daijia/driver/service/impl/CosServiceImpl.java +++ b/service/service-driver/src/main/java/com/atguigu/daijia/driver/service/impl/CosServiceImpl.java @@ -1,13 +1,99 @@ package com.atguigu.daijia.driver.service.impl; +import com.atguigu.daijia.driver.config.TencentCloudProperties; +import com.atguigu.daijia.driver.service.CiService; import com.atguigu.daijia.driver.service.CosService; +import com.atguigu.daijia.model.vo.driver.CosUploadVo; +import com.qcloud.cos.COSClient; +import com.qcloud.cos.http.HttpMethodName; +import com.qcloud.cos.model.GeneratePresignedUrlRequest; +import com.qcloud.cos.model.ObjectMetadata; +import com.qcloud.cos.model.PutObjectRequest; +import com.qcloud.cos.model.StorageClass; import lombok.extern.slf4j.Slf4j; +import org.joda.time.DateTime; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.net.URL; +import java.util.Date; +import java.util.Objects; +import java.util.UUID; @Slf4j @Service -@SuppressWarnings({"unchecked", "rawtypes"}) public class CosServiceImpl implements CosService { + @Autowired + private TencentCloudProperties tencentCloudProperties; + @Autowired + private COSClient cosClient; + + @Autowired + private CiService ciService; + + /** + * 上传文件 + * + * @param file 文件 + * @param path path + * @return CosUploadVo + */ + @Override + public CosUploadVo upload(MultipartFile file, String path) { + // 元数据信息 + ObjectMetadata meta = new ObjectMetadata(); + meta.setContentLength(file.getSize()); + meta.setContentEncoding("UTF-8"); + meta.setContentType(file.getContentType()); + + // 向存储桶中保存文件 + String fileType = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf(".")); // 文件后缀名 + String uploadPath = "/driver/" + path + "/" + UUID.randomUUID().toString().replaceAll("-", "") + fileType; + PutObjectRequest putObjectRequest; + try { + putObjectRequest = new PutObjectRequest(tencentCloudProperties.getBucketPrivate(), uploadPath, file.getInputStream(), meta); + } catch (IOException e) { + throw new RuntimeException(e); + } + putObjectRequest.setStorageClass(StorageClass.Standard); + + // 上传文件 + cosClient.putObject(putObjectRequest); + cosClient.shutdown(); + + // // 图片审核 + // Boolean imageAuditing = ciService.imageAuditing(uploadPath); + // if (!imageAuditing) { + // // 删除违规图片 + // cosClient.deleteObject(tencentCloudProperties.getBucketPrivate(), uploadPath); + // throw new GuiguException(ResultCodeEnum.IMAGE_AUDITION_FAIL); + // } + + // 返回vo对象 + CosUploadVo cosUploadVo = new CosUploadVo(); + cosUploadVo.setUrl(uploadPath); + // 图片临时访问url,回显使用 + String imageUrl = this.getImageUrl(uploadPath); + cosUploadVo.setShowUrl(imageUrl); + return cosUploadVo; + } + + public String getImageUrl(String path) { + if (!StringUtils.hasText(path)) return ""; + GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(tencentCloudProperties.getBucketPrivate(), path, HttpMethodName.GET); + + // 设置临时URL有效期为15分钟 + Date date = new DateTime().plusMinutes(15).toDate(); + request.setExpiration(date); + + // 调用方法获取 + URL url = cosClient.generatePresignedUrl(request); + cosClient.shutdown(); + return url.toString(); + } } diff --git a/web/web-driver/src/main/java/com/atguigu/daijia/driver/controller/CosController.java b/web/web-driver/src/main/java/com/atguigu/daijia/driver/controller/CosController.java index adbd595..fc09247 100644 --- a/web/web-driver/src/main/java/com/atguigu/daijia/driver/controller/CosController.java +++ b/web/web-driver/src/main/java/com/atguigu/daijia/driver/controller/CosController.java @@ -1,19 +1,30 @@ package com.atguigu.daijia.driver.controller; +import com.atguigu.daijia.common.result.Result; import com.atguigu.daijia.driver.service.CosService; +import com.atguigu.daijia.model.vo.driver.CosUploadVo; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; @Slf4j @Tag(name = "腾讯云cos上传接口管理") @RestController -@RequestMapping(value="/cos") -@SuppressWarnings({"unchecked", "rawtypes"}) +@RequestMapping(value = "/cos") public class CosController { - + @Autowired + private CosService cosService; + + @Operation(summary = "上传文件") + @PostMapping("upload") + public Result upload(@RequestPart("file") MultipartFile file, + @RequestParam(name = "path", defaultValue = "auth") String path) { + CosUploadVo vo = cosService.upload(file, path); + return Result.ok(vo); + } } diff --git a/web/web-driver/src/main/java/com/atguigu/daijia/driver/controller/FileController.java b/web/web-driver/src/main/java/com/atguigu/daijia/driver/controller/FileController.java index 21c2688..66cf154 100644 --- a/web/web-driver/src/main/java/com/atguigu/daijia/driver/controller/FileController.java +++ b/web/web-driver/src/main/java/com/atguigu/daijia/driver/controller/FileController.java @@ -1,15 +1,29 @@ package com.atguigu.daijia.driver.controller; +import com.atguigu.daijia.common.result.Result; import com.atguigu.daijia.driver.service.FileService; +import com.atguigu.daijia.model.vo.driver.CosUploadVo; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; @Tag(name = "上传管理接口") @RestController @RequestMapping("file") public class FileController { + @Autowired + private FileService fileService; + @Operation(summary = "上传") + @PostMapping("/upload") + public Result upload(@RequestPart("file") MultipartFile file) { + CosUploadVo cosUploadVo = fileService.upload(file); + return Result.ok(cosUploadVo.getShowUrl()); + } } diff --git a/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/CosService.java b/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/CosService.java index fef6748..17af6c1 100644 --- a/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/CosService.java +++ b/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/CosService.java @@ -1,6 +1,16 @@ package com.atguigu.daijia.driver.service; +import com.atguigu.daijia.model.vo.driver.CosUploadVo; +import org.springframework.web.multipart.MultipartFile; + public interface CosService { - + /** + * 上传文件 + * + * @param file 文件 + * @param path path + * @return CosUploadVo + */ + CosUploadVo upload(MultipartFile file, String path); } diff --git a/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/FileService.java b/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/FileService.java index 9295e79..9a9f26e 100644 --- a/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/FileService.java +++ b/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/FileService.java @@ -1,5 +1,15 @@ package com.atguigu.daijia.driver.service; +import com.atguigu.daijia.model.vo.driver.CosUploadVo; +import org.springframework.web.multipart.MultipartFile; + public interface FileService { + /** + * 上传文件 + * + * @param file 文件 + * @return CosUploadVo + */ + CosUploadVo upload(MultipartFile file); } diff --git a/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/impl/CosServiceImpl.java b/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/impl/CosServiceImpl.java index d946528..2182b7b 100644 --- a/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/impl/CosServiceImpl.java +++ b/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/impl/CosServiceImpl.java @@ -1,13 +1,31 @@ package com.atguigu.daijia.driver.service.impl; +import com.atguigu.daijia.common.result.Result; +import com.atguigu.daijia.driver.client.CosFeignClient; import com.atguigu.daijia.driver.service.CosService; +import com.atguigu.daijia.model.vo.driver.CosUploadVo; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; @Slf4j @Service -@SuppressWarnings({"unchecked", "rawtypes"}) public class CosServiceImpl implements CosService { + @Autowired + private CosFeignClient cosFeignClient; + /** + * 上传文件 + * + * @param file 文件 + * @param path path + * @return CosUploadVo + */ + @Override + public CosUploadVo upload(MultipartFile file, String path) { + Result voResult = cosFeignClient.upload(file, path); + return voResult.getData(); + } } diff --git a/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/impl/FileServiceImpl.java b/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/impl/FileServiceImpl.java index 0f9287b..369d1f1 100644 --- a/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/impl/FileServiceImpl.java +++ b/web/web-driver/src/main/java/com/atguigu/daijia/driver/service/impl/FileServiceImpl.java @@ -1,15 +1,31 @@ package com.atguigu.daijia.driver.service.impl; +import com.atguigu.daijia.common.result.Result; +import com.atguigu.daijia.driver.client.CosFeignClient; import com.atguigu.daijia.driver.service.FileService; +import com.atguigu.daijia.model.vo.driver.CosUploadVo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; @Slf4j @Service -@SuppressWarnings({"unchecked", "rawtypes"}) public class FileServiceImpl implements FileService { + @Autowired + private CosFeignClient cosFeignClient; - + /** + * 上传文件 + * + * @param file 文件 + * @return CosUploadVo + */ + @Override + public CosUploadVo upload(MultipartFile file) { + Result voResult = cosFeignClient.upload(file, "auth"); + return voResult.getData(); + } } +