diff --git a/src/main/java/com/xjhs/findmemerchant/file/FileController.java b/src/main/java/com/xjhs/findmemerchant/file/FileController.java new file mode 100644 index 0000000..a75754c --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/file/FileController.java @@ -0,0 +1,108 @@ +package com.xjhs.findmemerchant.file; + +import com.xjhs.findmemerchant.common.ApiResult; +import com.xjhs.findmemerchant.file.dao.FileMetaInfo; +import com.xjhs.findmemerchant.file.dao.FileMetaInfoRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.tika.mime.MimeTypes; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.UUID; + +/** + * 统一文件管理控制器 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +public class FileController { + + + @Value("${appconfig.amapKey}") + private String fileSaveRoot="./file-data"; + + private final FileMetaInfoRepository fileMetaInfoRepository; + + /** + * 获取并检查创建文件存储目录 + * @return 文件存储目录带日期 + */ + public Path getFileSavePath() throws IOException { + var datePath = DateTimeFormatter.ofPattern("yyyy/MM-dd").format(LocalDate.now()); + var path = Path.of(this.fileSaveRoot, datePath); + if (!Files.exists(path)){ + Files.createDirectories(path); + } + return path; + } + + + /** + * 上传文件 + * + * @param file 文件数据内容 + * @return 文件描信息 + */ + + @PostMapping("/platform/file/upload") + public ApiResult uploadFile(@RequestPart(name = "file") MultipartFile file) { + try { + var ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); + if (StringUtils.isEmpty(ext)) { + try { + ext = MimeTypes.getDefaultMimeTypes().forName(file.getContentType()).getExtension(); + } catch (Exception e) { + ext = ""; + } + } + + var filePath = Path.of(this.fileSaveRoot, UUID.randomUUID() + ext); + file.transferTo(filePath); + var fileMetaInfo = new FileMetaInfo(); + fileMetaInfo.setName(file.getOriginalFilename()); + fileMetaInfo.setContentType(file.getContentType()); + fileMetaInfo.setExtension(ext); + fileMetaInfo.setSavePath(filePath.toFile().getAbsolutePath()); + fileMetaInfoRepository.save(fileMetaInfo); + return ApiResult.data(fileMetaInfo); + } catch (Exception e) { + log.error(e.getMessage(),e); + return ApiResult.fail(e.getMessage()); + } + } + + /** + * 预览文件 + * @param fileId 文件id + * @return 文件内容 + */ + @GetMapping("/platform/file/view/{fileId}") + public ResponseEntity uploadFile(@PathVariable("fileId") String fileId) { + return this.fileMetaInfoRepository.findById(fileId).map(item->{ + try { + var bytes = Files.readAllBytes(Paths.get(item.getSavePath())); + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(item.getContentType())) + .body(bytes); + } catch (IOException e) { + return ResponseEntity.internalServerError().build(); + } + + }).orElse(ResponseEntity.internalServerError().build()); + + } + + +} \ No newline at end of file diff --git a/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfo.java b/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfo.java new file mode 100644 index 0000000..d735ee9 --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfo.java @@ -0,0 +1,41 @@ +package com.xjhs.findmemerchant.file.dao; + +import com.xjhs.findmemerchant.common.jpa.id.SnowflakeGenerated; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import lombok.Data; +import org.hibernate.annotations.Comment; + +import java.time.LocalDateTime; + + +/** + * 文件信息表 + */ +@Data +@Entity +@Comment("文件信息表") +public class FileMetaInfo { + @Id + @SnowflakeGenerated + @Comment("主键") + private Long id; + @Comment("文件原始名称") + private String name; + @Comment("文件媒体类型") + private String contentType; + @Comment("文件扩展名称") + @Column(length = 10) + private String extension; + @Comment("本地存储路径") + private String savePath; + @Comment("是否已迁移到云服务") + private boolean moveToCloud = false; + @Comment("云对象id") + @Column(length = 50) + private String cloudObjectId; + @Comment("创建时间") + private LocalDateTime createTime = LocalDateTime.now(); + +} \ No newline at end of file diff --git a/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfoRepository.java b/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfoRepository.java new file mode 100644 index 0000000..a7f845a --- /dev/null +++ b/src/main/java/com/xjhs/findmemerchant/file/dao/FileMetaInfoRepository.java @@ -0,0 +1,10 @@ +package com.xjhs.findmemerchant.file.dao; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.stereotype.Repository; + +@Repository +public interface FileMetaInfoRepository extends JpaRepository, JpaSpecificationExecutor { + +} \ No newline at end of file