文件服务

This commit is contained in:
2023-09-21 20:00:52 +08:00
parent f0e24ace09
commit f07f5f3743
8 changed files with 327 additions and 0 deletions

View File

@@ -0,0 +1,60 @@
package cn.lihongjie.coal.file.controller;
import cn.lihongjie.coal.annotation.OrgScope;
import cn.lihongjie.coal.annotation.SysLog;
import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
import cn.lihongjie.coal.file.dto.CreateFileDto;
import cn.lihongjie.coal.file.dto.FileDto;
import cn.lihongjie.coal.file.dto.UpdateFileDto;
import cn.lihongjie.coal.file.service.FileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/file")
@SysLog(module = "文件管理")
@Slf4j
@OrgScope
public class FileController {
@Autowired private FileService service;
@PostMapping("/create")
public FileDto create(@RequestBody CreateFileDto request) {
return this.service.create(request);
}
@PostMapping("/upload")
public FileDto upload(
@RequestParam("file") MultipartFile file,
@RequestParam("name") String name,
@RequestParam("dir") String dir) {
return this.service.upload(file, name, dir);
}
@PostMapping("/update")
public FileDto update(@RequestBody UpdateFileDto request) {
return this.service.update(request);
}
@PostMapping("/delete")
public Object delete(@RequestBody IdRequest request) {
this.service.delete(request);
return true;
}
@PostMapping("/getById")
public FileDto getById(@RequestBody String request) {
return this.service.getById(request);
}
@PostMapping("/list")
public Page<FileDto> list(@RequestBody CommonQuery request) {
return this.service.list(request);
}
}

View File

@@ -0,0 +1,28 @@
package cn.lihongjie.coal.file.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import lombok.Data;
import org.hibernate.annotations.Comment;
@Data
public class CreateFileDto extends OrgCommonDto {
@Comment("文件目录")
private String directory;
@Comment("文件名称")
private String fileName;
@Comment("文件mime")
private String mimeType;
@Comment("文件大小")
private Long fileSize;
@Comment("互联网访问地址")
private String publicUrl;
@Comment("局域网访问地址")
private String privateUrl;
}

View File

@@ -0,0 +1,28 @@
package cn.lihongjie.coal.file.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import lombok.Data;
import org.hibernate.annotations.Comment;
@Data
public class FileDto extends OrgCommonDto {
@Comment("文件目录")
private String directory;
@Comment("文件名称")
private String fileName;
@Comment("文件mime")
private String mimeType;
@Comment("文件大小")
private Long fileSize;
@Comment("互联网访问地址")
private String publicUrl;
@Comment("局域网访问地址")
private String privateUrl;
}

View File

@@ -0,0 +1,28 @@
package cn.lihongjie.coal.file.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import lombok.Data;
import org.hibernate.annotations.Comment;
@Data
public class UpdateFileDto extends OrgCommonDto {
@Comment("文件目录")
private String directory;
@Comment("文件名称")
private String fileName;
@Comment("文件mime")
private String mimeType;
@Comment("文件大小")
private Long fileSize;
@Comment("互联网访问地址")
private String publicUrl;
@Comment("局域网访问地址")
private String privateUrl;
}

View File

@@ -0,0 +1,35 @@
package cn.lihongjie.coal.file.entity;
import cn.lihongjie.coal.base.entity.OrgCommonEntity;
import jakarta.persistence.Entity;
import lombok.Data;
import org.hibernate.annotations.Comment;
@Data
@Entity
public class FileEntity extends OrgCommonEntity {
@Comment("文件目录")
private String directory;
@Comment("文件名称")
private String fileName;
@Comment("文件mime")
private String mimeType;
@Comment("文件大小")
private Long fileSize;
@Comment("互联网访问地址")
private String publicUrl;
@Comment("局域网访问地址")
private String privateUrl;
@Comment("对象ID")
private String objectId;
}

View File

@@ -0,0 +1,16 @@
package cn.lihongjie.coal.file.mapper;
import cn.lihongjie.coal.base.mapper.BaseMapper;
import cn.lihongjie.coal.base.mapper.CommonMapper;
import cn.lihongjie.coal.file.dto.CreateFileDto;
import cn.lihongjie.coal.file.dto.FileDto;
import cn.lihongjie.coal.file.dto.UpdateFileDto;
import cn.lihongjie.coal.file.entity.FileEntity;
import org.mapstruct.Mapper;
import org.mapstruct.control.DeepClone;
@Mapper(
componentModel = org.mapstruct.MappingConstants.ComponentModel.SPRING,
uses = {CommonMapper.class},
mappingControl = DeepClone.class)
public interface FileMapper extends BaseMapper<FileEntity, FileDto, CreateFileDto, UpdateFileDto> {}

View File

@@ -0,0 +1,9 @@
package cn.lihongjie.coal.file.repository;
import cn.lihongjie.coal.base.dao.BaseRepository;
import cn.lihongjie.coal.file.entity.FileEntity;
import org.springframework.stereotype.Repository;
@Repository
public interface FileRepository extends BaseRepository<FileEntity> {}

View File

@@ -0,0 +1,123 @@
package cn.lihongjie.coal.file.service;
import cn.lihongjie.coal.base.dto.CommonQuery;
import cn.lihongjie.coal.base.dto.IdRequest;
import cn.lihongjie.coal.base.service.BaseService;
import cn.lihongjie.coal.common.Ctx;
import cn.lihongjie.coal.exception.BizException;
import cn.lihongjie.coal.file.dto.CreateFileDto;
import cn.lihongjie.coal.file.dto.FileDto;
import cn.lihongjie.coal.file.dto.UpdateFileDto;
import cn.lihongjie.coal.file.entity.FileEntity;
import cn.lihongjie.coal.file.mapper.FileMapper;
import cn.lihongjie.coal.file.repository.FileRepository;
import cn.lihongjie.coal.spring.config.HwCloudProperty;
import com.obs.services.ObsClient;
import com.obs.services.model.PutObjectResult;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.tika.Tika;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.UUID;
@Service
@Slf4j
public class FileService extends BaseService<FileEntity, FileRepository> {
@Autowired ObsClient obsClient;
@Autowired HwCloudProperty hwCloudProperty;
@Autowired private FileRepository repository;
@Autowired private FileMapper mapper;
@Autowired private ConversionService conversionService;
private final Tika tika = new Tika();
@Value("${spring.profiles.active}")
private String activateProfile;
public FileDto create(CreateFileDto request) {
FileEntity entity = mapper.toEntity(request);
this.repository.save(entity);
return getById(entity.getId());
}
public FileDto update(UpdateFileDto request) {
FileEntity entity = this.repository.get(request.getId());
this.mapper.updateEntity(entity, request);
this.repository.save(entity);
return getById(entity.getId());
}
public void delete(IdRequest request) {
this.repository.deleteAllById(request.getIds());
}
public FileDto getById(String id) {
FileEntity entity = repository.get(id);
return mapper.toDto(entity);
}
public Page<FileDto> list(CommonQuery query) {
Page<FileEntity> page =
repository.findAll(
query.specification(conversionService),
PageRequest.of(
query.getPageNo(),
query.getPageSize(),
Sort.by(query.getOrders())));
return page.map(this.mapper::toDto);
}
@SneakyThrows
public FileDto upload(MultipartFile file, String name, String dir) {
FileEntity fileEntity = new FileEntity();
fileEntity.setFileName(name);
fileEntity.setFileSize(file.getSize());
fileEntity.setDirectory(
"%s/%s/%s"
.formatted(
activateProfile,
Ctx.currentUser().getOrganizationId(),
StringUtils.defaultIfBlank(dir, "public")));
InputStream inputStream = file.getInputStream();
fileEntity.setObjectId(
UUID.randomUUID() + "." + FilenameUtils.getExtension(name));
try (inputStream) {
fileEntity.setMimeType(tika.detect(inputStream));
}
PutObjectResult putObjectResult =
obsClient.putObject(
hwCloudProperty.getObs().getBucketName(),
fileEntity.getDirectory() + "/" + fileEntity.getObjectId(),
file.getInputStream());
if (putObjectResult.getStatusCode() != 200) {
throw new BizException("上传文件失败 %s".formatted(putObjectResult.toString()));
}
String objectUrl = putObjectResult.getObjectUrl();
fileEntity.setPublicUrl(objectUrl);
this.save(fileEntity);
return getById(fileEntity.getId());
}
}