From 9218b8c3ed061ea8e64e1bf31aef6a39a2e55ab3 Mon Sep 17 00:00:00 2001
From: haozq <1611483981@qq.com>
Date: Sat, 9 Nov 2024 20:42:00 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 12 +
.../plan/controller/PlanOutController.java | 53 +++-
.../plan/mapper/FileUploadMapper.java | 7 +
.../business/utils/FileUploadService.java | 9 +
.../bonus/gzgqj/business/utils/WordUtils.java | 294 ++++++++++++++++++
src/main/resources/application.yml | 4 +-
.../mappers/plan/FileUploadMapper.xml | 7 +
7 files changed, 383 insertions(+), 3 deletions(-)
create mode 100644 src/main/java/com/bonus/gzgqj/business/utils/WordUtils.java
diff --git a/pom.xml b/pom.xml
index bf669f1..1274b94 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,6 +34,18 @@
mybatis-spring-boot-starter
2.1.3
+
+ org.apache.httpcomponents
+ httpclient
+
+
+ org.apache.httpcomponents
+ httpmime
+
+
+ org.projectlombok
+ lombok
+
com.alibaba
druid-spring-boot-starter
diff --git a/src/main/java/com/bonus/gzgqj/business/plan/controller/PlanOutController.java b/src/main/java/com/bonus/gzgqj/business/plan/controller/PlanOutController.java
index 3ad3454..f7e7725 100644
--- a/src/main/java/com/bonus/gzgqj/business/plan/controller/PlanOutController.java
+++ b/src/main/java/com/bonus/gzgqj/business/plan/controller/PlanOutController.java
@@ -7,6 +7,8 @@ import cn.hutool.core.convert.Convert;
import com.bonus.gzgqj.business.plan.entity.*;
import com.bonus.gzgqj.business.plan.service.PlanApplicationService;
import com.bonus.gzgqj.business.plan.service.PlanOutService;
+import com.bonus.gzgqj.business.utils.FileUploadService;
+import com.bonus.gzgqj.business.utils.SystemUtils;
import com.bonus.gzgqj.manager.annotation.DecryptAndVerify;
import com.bonus.gzgqj.manager.common.util.ServletUtils;
import com.bonus.gzgqj.manager.core.entity.EncryptedReq;
@@ -15,18 +17,24 @@ import com.bonus.gzgqj.manager.webResult.StringUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FileUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import java.io.File;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
-
+import org.springframework.core.io.Resource;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
/**
* 出库 控制层
*
@@ -43,6 +51,8 @@ public class PlanOutController {
@Autowired
private PlanApplicationService planService;
+ @Autowired
+ private FileUploadService fileUploadService;
/**
* 发货 统计查询
* @return
@@ -296,4 +306,45 @@ public class PlanOutController {
+ /**
+ * "中文名称"文件下载
+ */
+ @GetMapping("/download")
+ public ResponseEntity fileDownload(HttpServletRequest request, String fileId) throws Exception{
+ //指定下载的文件根路径
+ String dirPath = SystemUtils.getUploadPath();
+ String filename=fileUploadService.getFilePath(fileId);
+
+ //创建该文件对象
+ File file = new File(dirPath +filename);
+ //设置响应头
+ HttpHeaders headers = new HttpHeaders();
+ //通知浏览器以下载方式打开(下载前对文件名进行转码)
+ filename=getFilename(request,filename);
+ headers.setContentDispositionFormData("attachment",filename);
+ //定义以流的形式下载返回文件数据
+ headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+ try {return new ResponseEntity<>(FileUtils.readFileToByteArray(file),
+ headers, HttpStatus.OK);} catch (Exception e) {e.printStackTrace();
+ return new ResponseEntity(e.getMessage().getBytes(),
+ HttpStatus.EXPECTATION_FAILED);
+ }
+ }
+ //根据浏览器的不同进行编码设置,返回编码后的文件名
+ private String getFilename(HttpServletRequest request,String filename)
+ throws Exception {
+ //IE不同版本User-Agent中出现的关键词
+ String[] IEBrowserKeyWords = {"MSIE", "Trident", "Edge"};
+ //获取请求头代理信息
+ String userAgent = request.getHeader("User-Agent");
+ for (String keyWord : IEBrowserKeyWords) {
+ if (userAgent.contains(keyWord)) {
+ //IE内核浏览器,统一为UTF-8编码显示,并对转换的+进行更正
+ return URLEncoder.encode(filename, "UTF-8").replace("+"," ");
+ }}
+ //火狐等其他浏览器统一为ISO-8859-1编码显示
+ return new String(filename.getBytes("UTF-8"), "ISO-8859-1");
+ }
+
+
}
diff --git a/src/main/java/com/bonus/gzgqj/business/plan/mapper/FileUploadMapper.java b/src/main/java/com/bonus/gzgqj/business/plan/mapper/FileUploadMapper.java
index acce713..059d5bb 100644
--- a/src/main/java/com/bonus/gzgqj/business/plan/mapper/FileUploadMapper.java
+++ b/src/main/java/com/bonus/gzgqj/business/plan/mapper/FileUploadMapper.java
@@ -22,4 +22,11 @@ public interface FileUploadMapper {
* @return
*/
List getFileList(FileUploadVo vo);
+
+ /**
+ * 查询文件路径
+ * @param fileId
+ * @return
+ */
+ String getFilePath(String fileId);
}
diff --git a/src/main/java/com/bonus/gzgqj/business/utils/FileUploadService.java b/src/main/java/com/bonus/gzgqj/business/utils/FileUploadService.java
index 03b657a..ade25e0 100644
--- a/src/main/java/com/bonus/gzgqj/business/utils/FileUploadService.java
+++ b/src/main/java/com/bonus/gzgqj/business/utils/FileUploadService.java
@@ -88,4 +88,13 @@ public class FileUploadService {
}
+ public String getFilePath(String fileId) {
+ try {
+ return mapper.getFilePath(fileId);
+
+ }catch (Exception e){
+ log.error(e.toString(),e);
+ }
+ return "";
+ }
}
diff --git a/src/main/java/com/bonus/gzgqj/business/utils/WordUtils.java b/src/main/java/com/bonus/gzgqj/business/utils/WordUtils.java
new file mode 100644
index 0000000..80ab64e
--- /dev/null
+++ b/src/main/java/com/bonus/gzgqj/business/utils/WordUtils.java
@@ -0,0 +1,294 @@
+package com.bonus.gzgqj.business.utils;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import org.apache.commons.io.IOUtils;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author 黑子
+ * @Auther: ccw
+ * @Date: 2021/07/22/9:57
+ * @description:
+ */
+public class WordUtils {
+
+ public static String pdf_fix="pdf";
+
+ public static String doc_fix="doc";
+
+ public static String docx_fix="docx";
+
+ /**
+ *
+ */
+ private static Configuration configuration = null;
+
+ static {
+ configuration = new Configuration(Configuration.VERSION_2_3_30);
+ configuration.setDefaultEncoding("utf-8");
+ configuration.setClassForTemplateLoading(WordUtils.class, "/download/");
+
+ }
+
+ private WordUtils() {
+ throw new AssertionError();
+ }
+
+ public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile) throws IOException {
+ Template freemarkerTemplate = configuration.getTemplate(ftlFile);
+ File file = null;
+ InputStream fin = null;
+ ServletOutputStream out = null;
+ try {
+ // 调用工具类的createDoc方法生成Word文档
+ file = createDoc(map, freemarkerTemplate);
+ fin = new FileInputStream(file);
+
+ response.setCharacterEncoding("utf-8");
+ response.setContentType("application/msword");
+ // 设置浏览器以下载的方式处理该文件名
+ String fileName = title + ".docx";
+ response.setHeader("Content-Disposition", "attachment;filename="
+ .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
+
+ out = response.getOutputStream();
+ byte[] buffer = new byte[512];
+ int bytesToRead = -1;
+ // 通过循环将读入的Word文件的内容输出到浏览器中
+ while ((bytesToRead = fin.read(buffer)) != -1) {
+ out.write(buffer, 0, bytesToRead);
+ }
+ } finally {
+ if (fin != null) {fin.close();}
+ if (out != null) {out.close();}
+ // 删除临时文件
+ if (file != null) {file.delete();}
+ }
+ }
+
+ private static File createDoc(Map, ?> dataMap, Template template) {
+ String name = "sellPlan.doc";
+ File f = new File(name);
+ Template t = template;
+ try {
+ // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
+ Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
+ t.process(dataMap, w);
+ w.close();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex);
+ }
+ return f;
+ }
+
+ public static void exportMillCertificateWord2(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile, String path) throws IOException {
+ Template freemarkerTemplate = configuration.getTemplate(ftlFile);
+ File file = null;
+ InputStream fin = null;
+ OutputStream out = null;
+ String uploadPath = path + "word" + File.separator;
+ try {
+ // 调用工具类的createDoc方法生成Word文档
+ file = createDoc(map, freemarkerTemplate);
+ fin = new FileInputStream(file);
+
+ File file2 = new File(uploadPath);
+ // 生成文件夹
+ if (!file2.exists()) {
+ file2.mkdirs();
+ }
+ String fileName = uploadPath + File.separator + title + ".doc";
+ out = new FileOutputStream(new File(fileName));
+ byte[] buffer = new byte[512];
+ int bytesToRead = -1;
+ // 通过循环将读入的Word文件的内容输出到浏览器中
+ while ((bytesToRead = fin.read(buffer)) != -1) {
+ out.write(buffer, 0, bytesToRead);
+ }
+ } finally {
+ if (fin != null) {fin.close();}
+ if (out != null) {out.close();}
+ // 删除临时文件
+ if (file != null) {file.delete();}
+ }
+ }
+
+ public static void exportPdf(HttpServletRequest request, HttpServletResponse response, String titleName, String fileName) throws IOException {
+ File file = null;
+ InputStream fin = null;
+ ServletOutputStream out = null;
+ try {
+ file = new File(fileName);
+ fin = new FileInputStream(file);
+
+ response.setCharacterEncoding("utf-8");
+ response.setContentType("application/pdf");
+ // 设置浏览器以下载的方式处理该文件名
+ response.setHeader("Content-Disposition", "attachment;filename="
+ .concat(String.valueOf(URLEncoder.encode(titleName, "UTF-8"))));
+ out = response.getOutputStream();
+ // 缓冲区
+ byte[] buffer = new byte[512];
+ int bytesToRead = -1;
+ // 通过循环将读入的pdf文件的内容输出到浏览器中
+ while ((bytesToRead = fin.read(buffer)) != -1) {
+ out.write(buffer, 0, bytesToRead);
+ }
+ } finally {
+ if (fin != null) {fin.close();}
+ if (out != null) {out.close();}
+ }
+ }
+
+ public static void exportFile(HttpServletRequest request, HttpServletResponse response, String fileName, byte[] decode) throws IOException {
+ InputStream fin = null;
+ ServletOutputStream out = null;
+ try {
+ fin = new ByteArrayInputStream(decode);
+ response.setCharacterEncoding("utf-8");
+ String subfix = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
+ if(Objects.equals(subfix,pdf_fix)){
+ response.setContentType("application/pdf");
+ }else if(Objects.equals(subfix,doc_fix) || Objects.equals(subfix,docx_fix)){
+ response.setContentType("application/msword");
+ }
+ // 设置浏览器以下载的方式处理该文件名
+ response.setHeader("Content-Disposition", "attachment;filename="
+ .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
+ out = response.getOutputStream();
+ // 缓冲区
+ byte[] buffer = new byte[512];
+ int bytesToRead = -1;
+ // 通过循环将读入的pdf文件的内容输出到浏览器中
+ while ((bytesToRead = fin.read(buffer)) != -1) {
+ out.write(buffer, 0, bytesToRead);
+ }
+ } finally {
+ if (fin != null) {fin.close();}
+ if (out != null) {out.close();}
+ }
+ }
+
+
+ /**
+ * @param outputDir 要下载的文件的绝对路径
+ * @param response HttpServletResponse
+ * @throws IOException
+ */
+ public static void fileDown(String outputDir,String fileName, HttpServletResponse response) throws IOException {
+ File file = null;
+ FileInputStream is = null;
+ try {
+ response.setContentType("text/html;charset=utf-8");
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("content-disposition", "attachment;filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
+ file = new File(outputDir);
+ is = new FileInputStream(file);
+ ServletOutputStream os = response.getOutputStream();
+ IOUtils.copy(is, os);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (is != null) {
+ is.close();
+ }
+ if (file != null) {
+ file.delete();
+ }
+ }
+
+ }
+ /**
+ * @return void
+ * @author cw chen
+ * @description 下载word文件
+ * @Param request
+ * @Param response
+ * @Param titleName
+ * @Param fileName
+ * @date 2023-04-17 11:07
+ */
+ public static void exportWord(HttpServletRequest request, HttpServletResponse response, String titleName, String fileName) throws IOException {
+ File file = null;
+ InputStream fin = null;
+ ServletOutputStream out = null;
+ try {
+ file = new File(fileName);
+ fin = new FileInputStream(file);
+
+ response.setCharacterEncoding("utf-8");
+ response.setContentType("application/msword");
+ // 设置浏览器以下载的方式处理该文件名
+ response.setHeader("Content-Disposition", "attachment;filename="
+ .concat(String.valueOf(URLEncoder.encode(titleName, "UTF-8"))));
+ out = response.getOutputStream();
+ // 缓冲区
+ byte[] buffer = new byte[512];
+ int bytesToRead = -1;
+ // 通过循环将读入的pdf文件的内容输出到浏览器中
+ while ((bytesToRead = fin.read(buffer)) != -1) {
+ out.write(buffer, 0, bytesToRead);
+ }
+ } finally {
+ if (fin != null) {fin.close();}
+ if (out != null) {out.close();}
+ }
+ }
+
+ /**
+ * @return void
+ * @author cw chen
+ * @description 下载word文件
+ * @Param request
+ * @Param response
+ * @Param titleName
+ * @Param fileName
+ * @date 2023-04-17 11:07
+ */
+ public static void exportVideo(HttpServletRequest request, HttpServletResponse response, String titleName, String fileName) throws IOException {
+ File file = null;
+ InputStream fin = null;
+ ServletOutputStream out = null;
+ try {
+ file = new File(fileName);
+ fin = new FileInputStream(file);
+ response.setCharacterEncoding("utf-8");
+ response.setContentType("video/mp4");
+ // 设置浏览器以下载的方式处理该文件名
+ response.setHeader("Content-Disposition", "attachment;filename="
+ .concat(String.valueOf(URLEncoder.encode(titleName, "UTF-8"))));
+ out = response.getOutputStream();
+ // 缓冲区
+ byte[] buffer = new byte[512];
+ int bytesToRead = -1;
+ // 通过循环将读入的pdf文件的内容输出到浏览器中
+ while ((bytesToRead = fin.read(buffer)) != -1) {
+ out.write(buffer, 0, bytesToRead);
+ }
+ } finally {
+ if (fin != null) {
+ fin.close();
+ }
+ if (out != null) {
+ out.close();
+ }
+ file.delete();
+ }
+ }
+
+
+
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 5af0998..267f338 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -40,8 +40,8 @@ zhly:
file:
upload_path:
- windows: D://files//zg_gqj//
- linux: /home/zg_gqj/files//
+ windows: D://files/zg_gqj/
+ linux: /home/zg_gqj/files/
diff --git a/src/main/resources/mappers/plan/FileUploadMapper.xml b/src/main/resources/mappers/plan/FileUploadMapper.xml
index 1c9ac3b..973a1d3 100644
--- a/src/main/resources/mappers/plan/FileUploadMapper.xml
+++ b/src/main/resources/mappers/plan/FileUploadMapper.xml
@@ -30,4 +30,11 @@
where own_id=#{ownId} and model_table=#{modelTable}
+
+
\ No newline at end of file