BigLawn 1 сар өмнө
parent
commit
0206cce844

+ 11 - 0
yudao-module-museum/yudao-module-museum-biz/pom.xml

@@ -65,6 +65,17 @@
             <version>4.0.3</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.11.0</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 2 - 0
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museumflow/MuseumFlowController.java

@@ -68,12 +68,14 @@ public class MuseumFlowController {
             MuseumInfoDO result = museumFlowService.selectMuseumFlowSampleId(sample_id);
             if (result == null) {
                 errorList.add(sample_id+"标本不存在");
+                return CommonResult.error(200, "标本不存在");
             }
             else {
                 int save = result.getSave();
                 String name = result.getChineseName();
                 if (save == 0) {
                     errorList.add(sample_id+"标本不在库中");
+                    return CommonResult.error(200, "标本不在库中");
                 }else {
                     sample_names.add(name);
                 }

+ 11 - 0
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/controller/admin/museumpicture/MuseumPictureController.java

@@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 
@@ -120,4 +121,14 @@ public class MuseumPictureController {
 //
 //        controller.handleUnzipRequest(groupId, zipFilePath);
 //    }
+
+
+    @PostMapping("/upload-zip")
+    @Operation(summary = "照片上传")
+    @PreAuthorize("@ss.hasPermission('system:tenant:query')")
+    public CommonResult<Boolean> uploadZip(@RequestParam("file") MultipartFile file,
+                                               @RequestParam("groupId") Long groupId) throws IOException {
+        museumPictureService.processZipUpload(file, groupId);
+        return CommonResult.success(true);
+    }
 }

+ 6 - 0
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/service/museumpicture/MuseumPictureService.java

@@ -5,6 +5,9 @@ import cn.iocoder.yudao.module.museum.controller.admin.museumpicture.vo.MuseumPi
 import cn.iocoder.yudao.module.museum.controller.admin.museumpicture.vo.PicturePageReqVO;
 import cn.iocoder.yudao.module.museum.dal.database.museumpicture.MuseumPictureDO;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
 
 
 @Service
@@ -40,4 +43,7 @@ public interface MuseumPictureService {
 
 //     解压并添加图片
 //     void unzipAndAddToGroup(String groupId, String zipFilePath) throws Exception;
+
+    void processZipUpload(MultipartFile file, Long groupId) throws IOException;
+
 }

+ 95 - 4
yudao-module-museum/yudao-module-museum-biz/src/main/java/cn/iocoder/yudao/module/museum/service/museumpicture/MuseumPictureServiceImpl.java

@@ -1,19 +1,24 @@
 package cn.iocoder.yudao.module.museum.service.museumpicture;
 
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.infra.api.file.FileApi;
 import cn.iocoder.yudao.module.museum.controller.admin.museumpicture.vo.MuseumPictureSaveVO;
 import cn.iocoder.yudao.module.museum.controller.admin.museumpicture.vo.PicturePageReqVO;
 import cn.iocoder.yudao.module.museum.dal.database.museumpicture.MuseumPictureDO;
 import cn.iocoder.yudao.module.museum.dal.mysql.museumpicture.MuseumPictureMapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
+import java.io.*;
+import java.util.Date;
 import java.util.List;
-import java.io.IOException;
+import java.util.Set;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
@@ -25,6 +30,9 @@ public  class MuseumPictureServiceImpl implements MuseumPictureService {
     @Resource
     private MuseumPictureMapper museumPictureMapper;
 
+    @Resource
+    private FileApi fileApi;
+
 //    @Override
 //    public Integer createMuseumPicture(MuseumPictureSaveVO saveVO){
 //        return museumPictureMapper.insert(BeanUtils.toBean(saveVO, MuseumPictureDO.class));
@@ -66,10 +74,93 @@ public  class MuseumPictureServiceImpl implements MuseumPictureService {
         return null;
     }
 
+
+//    private final Set<String> ALLOWED_EXTENSIONS = Set.of("jpg", "jpeg", "png", "gif");
+
+//    @Override
+//    public void processZipUpload(MultipartFile file, Long groupId) throws IOException {
+//        try (ZipInputStream zis = new ZipInputStream(file.getInputStream())) {
+//            ZipEntry entry;
+//            while ((entry = zis.getNextEntry()) != null) {
+//                processZipEntry(zis, entry, groupId);
+//            }
+//        }
+//    }
+//
+//    private void processZipEntry(ZipInputStream zis, ZipEntry entry, Long groupId) throws IOException {
+//        if (entry.isDirectory() || !isImageFile(entry.getName())) {
+//            return;
+//        }
+//
+//        // 读取文件内容并上传
+//        byte[] content = IoUtil.readBytes(zis);
+//        String url = fileApi.createFile(content);
+//
+//        // 构建并保存数据库记录
+//        MuseumPictureDO photo = new MuseumPictureDO();
+//        photo.setGroupId(Math.toIntExact(groupId));
+//        photo.setPictureUrl(url);
+//        museumPictureMapper.insert(photo);
+//    }
+//
+//    private boolean isImageFile(String filename) {
+//        String extension = FilenameUtil.getExtension(filename);
+//        return StringUtils.isNotEmpty(extension);
+////                ALLOWED_EXTENSIONS.contains(extension.toLowerCase());
+//    }
+
 //    @Override
 //    public MuseumPictureDO selectMuseumPictureSet(Integer group_id){
 //        return museumPictureMapper.selectMuseumPictureSetById(group_id);
 //    }
+
+
+    @Override
+    public void processZipUpload(MultipartFile file, Long groupId) {
+        if (file == null || file.isEmpty()) {
+            throw new IllegalArgumentException("上传的文件不能为空");
+        }
+
+        try (InputStream inputStream = file.getInputStream();
+             ZipInputStream zipInputStream = new ZipInputStream(inputStream)) {
+
+            ZipEntry entry;
+            while ((entry = zipInputStream.getNextEntry()) != null) {
+                if (!entry.isDirectory() && isImageFile(entry.getName())) {
+                    // 使用 ByteArrayOutputStream 读取当前条目的内容
+                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                    byte[] buffer = new byte[4096];
+                    int bytesRead;
+                    while ((bytesRead = zipInputStream.read(buffer)) != -1) {
+                        baos.write(buffer, 0, bytesRead);
+                    }
+                    byte[] content = baos.toByteArray();
+
+                    // 上传文件并获取 URL
+                    String url = fileApi.createFile(content);
+                    // 保存到数据库
+                    savePhotoToDatabase(groupId, url);
+                }
+                // 关闭当前条目
+                zipInputStream.closeEntry();
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("处理压缩包时发生错误", e);
+        }
+    }
+
+    private boolean isImageFile(String filename) {
+        // 简单检查文件扩展名是否为图片格式
+        String extension = StrUtil.subAfter(filename, '.', true).toLowerCase();
+        return extension != null && ("jpg,jpeg,png,gif,bmp".contains(extension));
+    }
+
+    private void savePhotoToDatabase(Long groupId, String url) {
+        MuseumPictureDO photo = new MuseumPictureDO();
+        photo.setGroupId(Math.toIntExact(groupId));
+        photo.setPictureUrl(url);
+        museumPictureMapper.insert(photo);
+    }
 }
 
 //     @Override