feat: 上传文件

This commit is contained in:
Bunny 2024-12-05 17:35:49 +08:00
parent 29f303b64d
commit b670ee61c1
12 changed files with 252 additions and 14 deletions

View File

@ -12,5 +12,7 @@ import org.springframework.web.multipart.MultipartFile;
@FeignClient(value = "service-driver") @FeignClient(value = "service-driver")
public interface CosFeignClient { public interface CosFeignClient {
// 上传文件
@PostMapping(value = "cos/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result<CosUploadVo> upload(@RequestPart("file") MultipartFile file, @RequestParam(name = "path", defaultValue = "auth") String path);
} }

View File

@ -18,6 +18,16 @@
<groupId>com.github.binarywang</groupId> <groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId> <artifactId>weixin-java-miniapp</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
</dependency>
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

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

View File

@ -1,9 +1,14 @@
package com.atguigu.daijia.driver.controller; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@Slf4j @Slf4j
@Tag(name = "腾讯云cos上传接口管理") @Tag(name = "腾讯云cos上传接口管理")
@ -11,6 +16,16 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping(value = "/cos") @RequestMapping(value = "/cos")
public class CosController { public class CosController {
@Autowired
private CosService cosService;
@Operation(summary = "上传")
@PostMapping("/upload")
//@GuiguLogin
public Result<CosUploadVo> upload(@RequestPart("file") MultipartFile file,
@RequestParam("path") String path) {
CosUploadVo cosUploadVo = cosService.upload(file, path);
return Result.ok(cosUploadVo);
}
} }

View File

@ -1,6 +1,16 @@
package com.atguigu.daijia.driver.service; package com.atguigu.daijia.driver.service;
import com.atguigu.daijia.model.vo.driver.CosUploadVo;
import org.springframework.web.multipart.MultipartFile;
public interface CosService { public interface CosService {
/**
* 上传文件
*
* @param file 文件
* @param path path
* @return CosUploadVo
*/
CosUploadVo upload(MultipartFile file, String path);
} }

View File

@ -1,13 +1,99 @@
package com.atguigu.daijia.driver.service.impl; 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.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 lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; 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 @Slf4j
@Service @Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class CosServiceImpl implements CosService { 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();
}
} }

View File

@ -1,19 +1,30 @@
package com.atguigu.daijia.driver.controller; package com.atguigu.daijia.driver.controller;
import com.atguigu.daijia.common.result.Result;
import com.atguigu.daijia.driver.service.CosService; 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 io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile;
@Slf4j @Slf4j
@Tag(name = "腾讯云cos上传接口管理") @Tag(name = "腾讯云cos上传接口管理")
@RestController @RestController
@RequestMapping(value = "/cos") @RequestMapping(value = "/cos")
@SuppressWarnings({"unchecked", "rawtypes"})
public class CosController { public class CosController {
@Autowired
private CosService cosService;
@Operation(summary = "上传文件")
@PostMapping("upload")
public Result<CosUploadVo> upload(@RequestPart("file") MultipartFile file,
@RequestParam(name = "path", defaultValue = "auth") String path) {
CosUploadVo vo = cosService.upload(file, path);
return Result.ok(vo);
}
} }

View File

@ -1,15 +1,29 @@
package com.atguigu.daijia.driver.controller; package com.atguigu.daijia.driver.controller;
import com.atguigu.daijia.common.result.Result;
import com.atguigu.daijia.driver.service.FileService; 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 io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired; 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.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@Tag(name = "上传管理接口") @Tag(name = "上传管理接口")
@RestController @RestController
@RequestMapping("file") @RequestMapping("file")
public class FileController { public class FileController {
@Autowired
private FileService fileService;
@Operation(summary = "上传")
@PostMapping("/upload")
public Result<String> upload(@RequestPart("file") MultipartFile file) {
CosUploadVo cosUploadVo = fileService.upload(file);
return Result.ok(cosUploadVo.getShowUrl());
}
} }

View File

@ -1,6 +1,16 @@
package com.atguigu.daijia.driver.service; package com.atguigu.daijia.driver.service;
import com.atguigu.daijia.model.vo.driver.CosUploadVo;
import org.springframework.web.multipart.MultipartFile;
public interface CosService { public interface CosService {
/**
* 上传文件
*
* @param file 文件
* @param path path
* @return CosUploadVo
*/
CosUploadVo upload(MultipartFile file, String path);
} }

View File

@ -1,5 +1,15 @@
package com.atguigu.daijia.driver.service; package com.atguigu.daijia.driver.service;
import com.atguigu.daijia.model.vo.driver.CosUploadVo;
import org.springframework.web.multipart.MultipartFile;
public interface FileService { public interface FileService {
/**
* 上传文件
*
* @param file 文件
* @return CosUploadVo
*/
CosUploadVo upload(MultipartFile file);
} }

View File

@ -1,13 +1,31 @@
package com.atguigu.daijia.driver.service.impl; 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.driver.service.CosService;
import com.atguigu.daijia.model.vo.driver.CosUploadVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Slf4j @Slf4j
@Service @Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class CosServiceImpl implements CosService { 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<CosUploadVo> voResult = cosFeignClient.upload(file, path);
return voResult.getData();
}
} }

View File

@ -1,15 +1,31 @@
package com.atguigu.daijia.driver.service.impl; 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.driver.service.FileService;
import com.atguigu.daijia.model.vo.driver.CosUploadVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Slf4j @Slf4j
@Service @Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class FileServiceImpl implements FileService { public class FileServiceImpl implements FileService {
@Autowired
private CosFeignClient cosFeignClient;
/**
* 上传文件
*
* @param file 文件
* @return CosUploadVo
*/
@Override
public CosUploadVo upload(MultipartFile file) {
Result<CosUploadVo> voResult = cosFeignClient.upload(file, "auth");
return voResult.getData();
} }
}