Bladeren bron

可以上传多个文件,可以压缩缩略图同时上传

gaodm 6 jaren geleden
bovenliggende
commit
db15b1e10c

+ 6 - 0
prec-service/pom.xml

@@ -170,6 +170,12 @@
             <artifactId>commons-io</artifactId>
             <version>2.4</version>
         </dependency>
+        <!--使用thumbnailator依赖包(图片压缩)-->
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.8</version>
+        </dependency>
 
     </dependencies>
 

+ 31 - 0
prec-service/src/main/java/com/diagbot/config/MultipartConfigurer.java

@@ -0,0 +1,31 @@
+package com.diagbot.config;
+
+import org.springframework.boot.web.servlet.MultipartConfigFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.unit.DataSize;
+
+import javax.servlet.MultipartConfigElement;
+
+/**
+ * @Description: 配置上传文件大小的配置
+ * @author: gaodm
+ * @time: 2019/5/9 11:18
+ */
+@Configuration
+public class MultipartConfigurer {
+    /**
+     * 配置上传文件大小的配置
+     *
+     * @return
+     */
+    @Bean
+    public MultipartConfigElement multipartConfigElement() {
+        MultipartConfigFactory factory = new MultipartConfigFactory();
+        //  单个数据大小
+        factory.setMaxFileSize(DataSize.ofMegabytes(500));
+        /// 总上传数据大小
+        factory.setMaxRequestSize(DataSize.ofMegabytes(500));
+        return factory.createMultipartConfig();
+    }
+}

+ 16 - 0
prec-service/src/main/java/com/diagbot/dto/FileThumDTO.java

@@ -0,0 +1,16 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2019/6/12 10:01
+ */
+@Getter
+@Setter
+public class FileThumDTO {
+    FileDTO source;
+    FileDTO thumbnail;
+}

+ 8 - 0
prec-service/src/main/java/com/diagbot/service/UploadService.java

@@ -1,13 +1,21 @@
 package com.diagbot.service;
 
 import com.diagbot.dto.FileDTO;
+import com.diagbot.dto.FileThumDTO;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * @Description: 文件上传服务接口
  * @author: gaodm
  * @time: 2018/11/13 13:50
  */
 public interface UploadService {
+    //单文件上传
     FileDTO singleFileUpload(MultipartFile file);
+    //多文件上传
+    List<FileDTO> multiFileUpload(MultipartFile[] mpfs);
+    //多文件上传同时生成缩略图
+    List<FileThumDTO> multiFileThumUpload(MultipartFile[] mpfs);
 }

+ 123 - 5
prec-service/src/main/java/com/diagbot/service/impl/UploadServiceImpl.java

@@ -3,13 +3,21 @@ package com.diagbot.service.impl;
 import com.diagbot.client.fastdfs.FastDFSClient;
 import com.diagbot.client.fastdfs.FastDFSFile;
 import com.diagbot.dto.FileDTO;
+import com.diagbot.dto.FileThumDTO;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
 import com.diagbot.service.UploadService;
 import lombok.extern.slf4j.Slf4j;
+import net.coobird.thumbnailator.Thumbnails;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @Description: 文件上传服务接口实现
@@ -24,9 +32,9 @@ public class UploadServiceImpl implements UploadService {
         if (file.isEmpty()) {
             return new FileDTO("FAILURE", "文件不能为空");
         }
-        //文件大小上限1M
-        if (file.getSize() > 1024 * 1024) {
-            return new FileDTO("FAILURE", "文件上传失败,超出大小限制1MB");
+        //文件大小上限4M
+        if (file.getSize() > 4 * 1024 * 1024) {
+            return new FileDTO("FAILURE", "文件上传失败,超出大小限制4MB");
         }
         try {
             FileDTO fileDTO = saveFile(file);
@@ -37,6 +45,89 @@ public class UploadServiceImpl implements UploadService {
         }
     }
 
+    @Override
+    public List<FileDTO> multiFileUpload(MultipartFile[] mpfs) {
+        // 上传文件返回的路径集合
+        List<FileDTO> fileDTOS = new ArrayList<>();
+        if (null == mpfs) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "文件不能为空");
+        }
+
+        for (MultipartFile file : mpfs) {
+            if (file.isEmpty()) {
+                fileDTOS.add(new FileDTO("FAILURE", "文件不能为空"));
+                continue;
+            }
+            //文件大小上限4M
+            if (file.getSize() > 4 * 1024 * 1024) {
+                fileDTOS.add(new FileDTO("FAILURE", "文件上传失败,超出大小限制4MB"));
+                continue;
+            }
+
+            try {
+                FileDTO fileDTO = saveFile(file);
+                fileDTOS.add(fileDTO);
+            } catch (Exception e) {
+                log.error("文件上传失败", e);
+                fileDTOS.add(new FileDTO("FAILURE", "文件上传失败,请重新上传"));
+            }
+        }
+        return fileDTOS;
+    }
+
+
+    @Override
+    public List<FileThumDTO> multiFileThumUpload(MultipartFile[] mpfs) {
+        // 上传文件返回的路径集合
+        List<FileThumDTO> fileDTOS = new ArrayList<>();
+        if (null == mpfs) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "文件不能为空");
+        }
+
+        FileThumDTO fileThumDTO = null;
+        for (MultipartFile file : mpfs) {
+            if (file.isEmpty()) {
+                fileThumDTO = new FileThumDTO();
+                fileThumDTO.setSource(new FileDTO("FAILURE", "文件不能为空"));
+                fileDTOS.add(fileThumDTO);
+                continue;
+            }
+            //文件大小上限4M
+            if (file.getSize() > 4 * 1024 * 1024) {
+                fileThumDTO = new FileThumDTO();
+                fileThumDTO.setSource(new FileDTO("FAILURE", "文件上传失败,超出大小限制4MB"));
+                fileDTOS.add(fileThumDTO);
+                continue;
+            }
+
+            try {
+                fileThumDTO = saveFileWithThum(file);
+                fileDTOS.add(fileThumDTO);
+            } catch (Exception e) {
+                log.error("文件上传失败", e);
+                fileThumDTO = new FileThumDTO();
+                fileThumDTO.setSource(new FileDTO("FAILURE", "文件上传失败,请重新上传"));
+                fileDTOS.add(fileThumDTO);
+            }
+        }
+        return fileDTOS;
+    }
+
+    /**
+     * @param multipartFile
+     * @return
+     * @throws IOException
+     */
+    public FileThumDTO saveFileWithThum(MultipartFile multipartFile) throws IOException {
+        FileThumDTO fileThumDTO = new FileThumDTO();
+        //原图上传到服务器
+        FileDTO source = saveFile(multipartFile);
+        fileThumDTO.setSource(source);
+        //压缩图片
+        FileDTO thumbnail = saveFile(multipartFile, true);
+        fileThumDTO.setThumbnail(thumbnail);
+        return fileThumDTO;
+    }
 
     /**
      * @param multipartFile
@@ -44,12 +135,29 @@ public class UploadServiceImpl implements UploadService {
      * @throws IOException
      */
     public FileDTO saveFile(MultipartFile multipartFile) throws IOException {
+        return saveFile(multipartFile, false);
+    }
 
+    /**
+     * @param multipartFile
+     * @return
+     * @throws IOException
+     */
+    public FileDTO saveFile(MultipartFile multipartFile, Boolean isThum) throws IOException {
         String[] fileAbsolutePath = {};
         String fileName = multipartFile.getOriginalFilename();
         String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
         byte[] file_buff = null;
         InputStream inputStream = multipartFile.getInputStream();
+        //压缩图片
+        if (isThum) {
+            Integer width = 280;
+            Integer hight = 430;
+            //文件名重新命名
+            fileName = width + "_" + hight + "_" + fileName;
+            inputStream = compress(inputStream, width, hight);
+        }
+
         if (inputStream != null) {
             int len1 = inputStream.available();
             file_buff = new byte[len1];
@@ -70,9 +178,19 @@ public class UploadServiceImpl implements UploadService {
         String path = "/" + fileAbsolutePath[0] + "/" + fileAbsolutePath[1];
         FileDTO fileDTO = new FileDTO("SUCCESS", "文件上传成功");
         fileDTO.setUrl(path);
-        fileDTO.setOriginal(multipartFile.getOriginalFilename());
-        fileDTO.setTitle(multipartFile.getOriginalFilename());
+        fileDTO.setOriginal(fileName);
+        fileDTO.setTitle(fileName);
         return fileDTO;
+
+    }
+
+    public ByteArrayInputStream compress(InputStream inputStream, Integer width, Integer hight) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        Thumbnails.of(inputStream)
+                .size(width, hight)
+                .toOutputStream(baos);
+        final ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
+        return swapStream;
     }
 
     /**

+ 34 - 2
prec-service/src/main/java/com/diagbot/web/UploadController.java

@@ -1,6 +1,7 @@
 package com.diagbot.web;
 
 import com.diagbot.dto.FileDTO;
+import com.diagbot.dto.FileThumDTO;
 import com.diagbot.facade.UploadFacade;
 import com.diagbot.util.FastJsonUtils;
 import com.diagbot.util.StringUtil;
@@ -18,16 +19,17 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 @RestController
-@Api(value = "文件上传API", tags = { "文件上传API" })
+@Api(value = "文件上传API", tags = { "知识库标准化-文件上传API" })
 @RequestMapping(value = "/file")
 @SuppressWarnings("unchecked")
 public class UploadController {
     @Autowired
     private UploadFacade uploadFacade;
 
-    @ApiOperation(value = "文件上传")
+    @ApiOperation(value = "知识库标准化-单个文件上传")
     @CrossOrigin(allowCredentials = "true", allowedHeaders = "*", methods = { RequestMethod.POST }, origins = "*")
     @PostMapping(value = "/uploadImage", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     public String singleFileUpload(@RequestParam("upfile") MultipartFile file, HttpServletRequest request, HttpServletResponse response) {
@@ -42,6 +44,36 @@ public class UploadController {
         return data;
     }
 
+    @ApiOperation(value = "知识库标准化-多个文件上传")
+    @CrossOrigin(allowCredentials = "true", allowedHeaders = "*", methods = { RequestMethod.POST }, origins = "*")
+    @PostMapping(value = "/uploadImages", produces = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public String multiFileUpload(@RequestParam("upfiles") MultipartFile[] file, HttpServletRequest request, HttpServletResponse response) {
+        List<FileDTO> fileDTO = uploadFacade.multiFileUpload(file);
+        String data = FastJsonUtils.getBeanToJson(fileDTO);
+        response.setContentType("text/plain;charset=UTF-8");
+
+        String callback = request.getParameter("callback");//客户端请求参数
+        if (callback != null && StringUtil.isNotBlank(callback)) {
+            data = callback + "(" + data + ")";
+        }
+        return data;
+    }
+
+    @ApiOperation(value = "知识库标准化-多个文件上传同时生成缩略图")
+    @CrossOrigin(allowCredentials = "true", allowedHeaders = "*", methods = { RequestMethod.POST }, origins = "*")
+    @PostMapping(value = "/uploadImageThums", produces = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public String multiFileThumUpload(@RequestParam("upfiles") MultipartFile[] file, HttpServletRequest request, HttpServletResponse response) {
+        List<FileThumDTO> fileDTO = uploadFacade.multiFileThumUpload(file);
+        String data = FastJsonUtils.getBeanToJson(fileDTO);
+        response.setContentType("text/plain;charset=UTF-8");
+
+        String callback = request.getParameter("callback");//客户端请求参数
+        if (callback != null && StringUtil.isNotBlank(callback)) {
+            data = callback + "(" + data + ")";
+        }
+        return data;
+    }
+
     @PostMapping("/deleteRemoteFile")
     @ApiOperation(value = "知识库标准化-文件删除")
     public String deleteRemoteFile(@RequestParam("path") String path) {

+ 31 - 0
precman-service/src/main/java/com/diagbot/config/MultipartConfigurer.java

@@ -0,0 +1,31 @@
+package com.diagbot.config;
+
+import org.springframework.boot.web.servlet.MultipartConfigFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.unit.DataSize;
+
+import javax.servlet.MultipartConfigElement;
+
+/**
+ * @Description: 配置上传文件大小的配置
+ * @author: gaodm
+ * @time: 2019/5/9 11:18
+ */
+@Configuration
+public class MultipartConfigurer {
+    /**
+     * 配置上传文件大小的配置
+     *
+     * @return
+     */
+    @Bean
+    public MultipartConfigElement multipartConfigElement() {
+        MultipartConfigFactory factory = new MultipartConfigFactory();
+        //  单个数据大小
+        factory.setMaxFileSize(DataSize.ofMegabytes(500));
+        /// 总上传数据大小
+        factory.setMaxRequestSize(DataSize.ofMegabytes(500));
+        return factory.createMultipartConfig();
+    }
+}