package org.sxkj.resource.endpoint; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import org.jetbrains.annotations.NotNull; import org.springblade.core.oss.model.BladeFile; import org.springblade.core.oss.model.OssFile; import org.springblade.core.secure.annotation.PreAuth; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.core.tool.constant.RoleConstant; import org.springblade.core.tool.utils.FileUtil; import org.springblade.core.tool.utils.Func; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.sxkj.resource.builder.OssBuilder; import org.sxkj.resource.entity.Attach; import org.sxkj.resource.service.IAttachService; import org.sxkj.resource.util.ImageCompressorUtil; import springfox.documentation.annotations.ApiIgnore; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * 对象存储端点 * * @author Chill */ @NonDS @RestController @AllArgsConstructor @RequestMapping("/oss/endpoint") @Api(value = "对象存储端点", tags = "文件上传接口") public class OssEndpoint { /** * 对象存储构建类 */ private final OssBuilder ossBuilder; /** * 附件表服务 */ private final IAttachService attachService; /** * 创建存储桶 * * @param bucketName 存储桶名称 * @return Bucket */ @SneakyThrows @PostMapping("/make-bucket") @PreAuth(RoleConstant.HAS_ROLE_ADMIN) @ApiIgnore public R makeBucket(@RequestParam String bucketName) { ossBuilder.template().makeBucket(bucketName); return R.success("创建成功"); } /** * 创建存储桶 * * @param bucketName 存储桶名称 * @return R */ @SneakyThrows @PostMapping("/remove-bucket") @PreAuth(RoleConstant.HAS_ROLE_ADMIN) @ApiIgnore public R removeBucket(@RequestParam String bucketName) { ossBuilder.template().removeBucket(bucketName); return R.success("删除成功"); } /** * 拷贝文件 * * @param fileName 存储桶对象名称 * @param destBucketName 目标存储桶名称 * @param destFileName 目标存储桶对象名称 * @return R */ @SneakyThrows @PostMapping("/copy-file") @ApiOperation(value = "拷贝文件", notes = "拷贝文件") public R copyFile(@RequestParam String fileName, @RequestParam String destBucketName, String destFileName) { ossBuilder.template().copyFile(fileName, destBucketName, destFileName); return R.success("操作成功"); } /** * 获取文件信息 * * @param fileName 存储桶对象名称 * @return InputStream */ @SneakyThrows @GetMapping("/stat-file") @ApiOperation(value = "获取文件信息", notes = "获取文件信息") public R statFile(@RequestParam String fileName) { return R.data(ossBuilder.template().statFile(fileName)); } /** * 获取文件相对路径 * * @param fileName 存储桶对象名称 * @return String */ @SneakyThrows @GetMapping("/file-path") @ApiOperation(value = "获取文件相对路径", notes = "获取文件相对路径") public R filePath(@RequestParam String fileName) { return R.data(ossBuilder.template().filePath(fileName)); } /** * 获取文件外链 * * @param fileName 存储桶对象名称 * @return String */ @SneakyThrows @GetMapping("/file-link") @ApiOperation(value = "获取文件外链", notes = "获取文件外链") public R fileLink(@RequestParam String fileName) { return R.data(ossBuilder.template().fileLink(fileName)); } /** * 上传文件 * * @param file 文件 * @return ObjectStat */ @SneakyThrows @PostMapping("/put-file") @ApiOperation(value = "上传文件", notes = "上传文件") public R putFile(@RequestParam MultipartFile file) { BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), file.getInputStream()); return R.data(bladeFile); } /** * 上传文件 * * @param fileName 存储桶对象名称 * @param file 文件 * @return ObjectStat */ @SneakyThrows @PostMapping("/put-file-by-name") @ApiOperation(value = "上传文件", notes = "上传文件-存储桶对象名称") public R putFile(@RequestParam String fileName, @RequestParam MultipartFile file) { BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); return R.data(bladeFile); } /** * 上传文件并保存至附件表 * * @param file 文件 * @return ObjectStat */ @SneakyThrows @PostMapping("/put-file-attach") @ApiOperation(value = "上传文件并保存至附件表", notes = "上传文件并保存至附件表") public R putFileAttach(@RequestParam MultipartFile file) { BladeFile bladeFile = getBladeFile(file); return R.data(bladeFile); } /** * 上传文件并保存至附件表 * * @param fileName 存储桶对象名称 * @param resultType 结果类型 * @param file 上传文件 * @return BladeFile */ @SneakyThrows @PostMapping("/put-file-attach-by-name") @ApiOperation(value = "上传文件并保存至附件表", notes = "上传文件并保存至附件表-存储桶对象名称") public R putFileAttach(@RequestParam String fileName, @RequestParam Integer resultType, @RequestParam MultipartFile file) { BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); Long attachId = buildAttach(fileName, resultType, file.getSize(), bladeFile); bladeFile.setAttachId(attachId); return R.data(bladeFile); } /** * 上传原图和压缩图并保存至附件表 * * @param file 文件 * @return ObjectStat */ @SneakyThrows @PostMapping("/put-file-cop-attach") @ApiOperation(value = "上传原图和压缩图并保存至附件表", notes = "上传原图和压缩图并保存至附件表") public R putFileCopAttach(@RequestParam MultipartFile file) { // 上传之前先压缩 MultipartFile compressImage = ImageCompressorUtil.compressImage(file, null); // 上传 BladeFile bladeFile = getBladeFile(file); BladeFile compressFile = getBladeFile(compressImage); // Map map = new HashMap<>(2); map.put("yt", bladeFile); map.put("yst", compressFile); // 返回 return R.data(bladeFile); } @NotNull private BladeFile getBladeFile(@RequestParam MultipartFile file) throws IOException { String fileName = file.getOriginalFilename(); BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream()); Long attachId = buildAttach(fileName, null, file.getSize(), bladeFile); bladeFile.setAttachId(attachId); return bladeFile; } /** * 构建附件表 * * @param fileName 文件名 * @param fileSize 文件大小 * @param bladeFile 对象存储文件 * @return attachId */ private Long buildAttach(String fileName, Integer resultType, Long fileSize, BladeFile bladeFile) { String fileExtension = FileUtil.getFileExtension(fileName); Attach attach = new Attach(); attach.setDomainUrl(bladeFile.getDomain()); attach.setLink(bladeFile.getLink()); attach.setName(bladeFile.getName()); attach.setResultType(resultType); attach.setOriginalName(bladeFile.getOriginalName()); attach.setAttachSize(fileSize); attach.setExtension(fileExtension); attachService.save(attach); return attach.getId(); } /** * 删除文件 * * @param fileName 存储桶对象名称 * @return R */ @SneakyThrows @PostMapping("/remove-file") @PreAuth(RoleConstant.HAS_ROLE_ADMIN) @ApiOperation(value = "删除文件", notes = "删除文件") public R removeFile(@RequestParam String fileName) { ossBuilder.template().removeFile(fileName); return R.success("操作成功"); } /** * 批量删除文件 * * @param fileNames 存储桶对象名称集合 * @return R */ @SneakyThrows @PostMapping("/remove-files") @PreAuth(RoleConstant.HAS_ROLE_ADMIN) @ApiOperation(value = "批量删除文件", notes = "批量删除文件") public R removeFiles(@RequestParam String fileNames) { ossBuilder.template().removeFiles(Func.toStrList(fileNames)); return R.success("操作成功"); } }