文件下载
This commit is contained in:
parent
9e59aa7097
commit
9218b8c3ed
12
pom.xml
12
pom.xml
|
|
@ -34,6 +34,18 @@
|
||||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||||
<version>2.1.3</version>
|
<version>2.1.3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpmime</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>druid-spring-boot-starter</artifactId>
|
<artifactId>druid-spring-boot-starter</artifactId>
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,8 @@ import cn.hutool.core.convert.Convert;
|
||||||
import com.bonus.gzgqj.business.plan.entity.*;
|
import com.bonus.gzgqj.business.plan.entity.*;
|
||||||
import com.bonus.gzgqj.business.plan.service.PlanApplicationService;
|
import com.bonus.gzgqj.business.plan.service.PlanApplicationService;
|
||||||
import com.bonus.gzgqj.business.plan.service.PlanOutService;
|
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.annotation.DecryptAndVerify;
|
||||||
import com.bonus.gzgqj.manager.common.util.ServletUtils;
|
import com.bonus.gzgqj.manager.common.util.ServletUtils;
|
||||||
import com.bonus.gzgqj.manager.core.entity.EncryptedReq;
|
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.PageHelper;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.*;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.servlet.ServletOutputStream;
|
import javax.servlet.ServletOutputStream;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.File;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
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
|
@Autowired
|
||||||
private PlanApplicationService planService;
|
private PlanApplicationService planService;
|
||||||
|
@Autowired
|
||||||
|
private FileUploadService fileUploadService;
|
||||||
/**
|
/**
|
||||||
* 发货 统计查询
|
* 发货 统计查询
|
||||||
* @return
|
* @return
|
||||||
|
|
@ -296,4 +306,45 @@ public class PlanOutController {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* "中文名称"文件下载
|
||||||
|
*/
|
||||||
|
@GetMapping("/download")
|
||||||
|
public ResponseEntity<byte[]> 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<byte[]>(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");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,4 +22,11 @@ public interface FileUploadMapper {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<FileUploadVo> getFileList(FileUploadVo vo);
|
List<FileUploadVo> getFileList(FileUploadVo vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询文件路径
|
||||||
|
* @param fileId
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String getFilePath(String fileId);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -40,8 +40,8 @@ zhly:
|
||||||
|
|
||||||
file:
|
file:
|
||||||
upload_path:
|
upload_path:
|
||||||
windows: D://files//zg_gqj//
|
windows: D://files/zg_gqj/
|
||||||
linux: /home/zg_gqj/files//
|
linux: /home/zg_gqj/files/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,4 +30,11 @@
|
||||||
where own_id=#{ownId} and model_table=#{modelTable}
|
where own_id=#{ownId} and model_table=#{modelTable}
|
||||||
|
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="getFilePath" resultType="java.lang.String">
|
||||||
|
select file_url fileUrl
|
||||||
|
from bm_file_upload
|
||||||
|
WHERE id=#{id}
|
||||||
|
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
Loading…
Reference in New Issue