package com.ymwk.icvp.signature.controller; import com.ymwk.icvp.component.PageParam; import com.ymwk.icvp.component.PageResult; import com.ymwk.icvp.component.ResponseDTO; import com.ymwk.icvp.signature.entity.Picture; import com.ymwk.icvp.signature.mapper.PictureMapper; import com.ymwk.icvp.signature.model.PictureGenerateRequest; import com.ymwk.icvp.signature.model.PictureListRequest; import com.ymwk.icvp.signature.service.PictureService; import com.ymwk.icvp.signature.service.impl.SealGenerateService; import com.ymwk.icvp.utils.MinioClientService; import com.ymwk.icvp.utils.MinioConfig; import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("/api/v1/pictures") public class PictureController { @Autowired private PictureService pictureService; @Autowired private PictureMapper pictureMapper; @Autowired private SealGenerateService sealGenerateService; @Autowired private MinioClientService minioClientService; @Autowired private MinioConfig minioConfig; //印模列表 @PostMapping("/list") public ResponseDTO> getPictureList(@RequestBody PictureListRequest pictureListRequest) { return pictureService.getPictureList(pictureListRequest); } //生成印模图片并上传到MinIO @ResponseBody @RequestMapping("/generate") public ResponseDTO> generateSeal( @RequestBody PictureGenerateRequest request ) throws Exception { // 1. 生成图片 BufferedImage image = sealGenerateService.generate(request); // 2. 将BufferedImage转换为MultipartFile ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(image, "png", baos); baos.flush(); byte[] imageBytes = baos.toByteArray(); baos.close(); // 创建MultipartFile对象 MultipartFile multipartFile = new MockMultipartFile( "seal.png", "seal.png", "image/png", imageBytes ); // 3. 上传到MinIO String fileName = minioClientService.uploadFile(multipartFile); // 4. 生成下载链接 String downloadUrl = minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() + "/" + fileName; Picture picture = new Picture(); picture.setName(request.getName() != null && !request.getName().isEmpty() ? request.getName() : fileName); picture.setUrl(downloadUrl); picture.setCreateTime(new Date()); pictureMapper.insert(picture); // 或 pictureService.save(picture) // 5. 返回下载链接 Map response = new HashMap<>(); response.put("downloadUrl", downloadUrl); return ResponseDTO.ok(response); } //下载印模图片 //TODO 下载出来0kb的空文件 @GetMapping("/download") public void downloadSeal(@RequestParam String fileName, HttpServletResponse response) { try (InputStream is = minioClientService.downloadFile(fileName); OutputStream os = response.getOutputStream()) { response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, StandardCharsets.UTF_8) + "\""); byte[] buffer = new byte[8192]; int len; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } os.flush(); } catch (Exception e) { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } //删除印模图片 @PostMapping("/delete") public ResponseDTO deleteSeal(@RequestParam Integer id) { return pictureService.deletePicture(id); } }