From 8b9514726bdd8742f0158f1d38f26e489adfbfa7 Mon Sep 17 00:00:00 2001 From: yangzhicheng Date: Mon, 8 Jul 2024 16:44:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD=E5=A4=84?= =?UTF-8?q?=E7=90=86=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/FileController.java | 11 +++++ .../modules/system/service/IFileService.java | 3 ++ .../system/service/impl/FileServiceImpl.java | 49 +++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/src/main/java/org/energy/modules/system/controller/FileController.java b/src/main/java/org/energy/modules/system/controller/FileController.java index 040b880..066b3d5 100644 --- a/src/main/java/org/energy/modules/system/controller/FileController.java +++ b/src/main/java/org/energy/modules/system/controller/FileController.java @@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; +import javax.servlet.http.HttpServletResponse; import java.io.File; import java.util.Date; import java.util.HashMap; @@ -84,6 +85,16 @@ public class FileController { return R.data(JSON.toJSONString(resultMap)); } + /** + * 附件上载 + */ + @ApiOperation("附件下载") + @GetMapping(value = "/download") + @ResponseBody + public void download(@RequestParam("fileName") String fileName, HttpServletResponse response) { + fileService.downloadFile(fileName, response); + } + } diff --git a/src/main/java/org/energy/modules/system/service/IFileService.java b/src/main/java/org/energy/modules/system/service/IFileService.java index 49d70f7..2c4ed82 100644 --- a/src/main/java/org/energy/modules/system/service/IFileService.java +++ b/src/main/java/org/energy/modules/system/service/IFileService.java @@ -5,6 +5,7 @@ import org.energy.modules.system.vo.FileVO; import com.dayu.daf.core.mp.base.BaseService; import com.baomidou.mybatisplus.core.metadata.IPage; +import javax.servlet.http.HttpServletResponse; import java.util.Map; /** @@ -26,4 +27,6 @@ public interface IFileService extends BaseService { Map saveFileInfo(String fileType, String filePath, String fileName, String fileSuffix, String oldFileName); + void downloadFile(String fileName, HttpServletResponse response); + } diff --git a/src/main/java/org/energy/modules/system/service/impl/FileServiceImpl.java b/src/main/java/org/energy/modules/system/service/impl/FileServiceImpl.java index d86d821..040ecff 100644 --- a/src/main/java/org/energy/modules/system/service/impl/FileServiceImpl.java +++ b/src/main/java/org/energy/modules/system/service/impl/FileServiceImpl.java @@ -1,5 +1,7 @@ package org.energy.modules.system.service.impl; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.dayu.daf.core.log.exception.ServiceException; import org.energy.modules.system.entity.File; import org.energy.modules.system.vo.FileVO; import org.energy.modules.system.mapper.FileMapper; @@ -8,6 +10,9 @@ import com.dayu.daf.core.mp.base.BaseServiceImpl; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.metadata.IPage; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; import java.util.HashMap; import java.util.Map; @@ -42,4 +47,48 @@ public class FileServiceImpl extends BaseServiceImpl implement return null; } + @Override + public void downloadFile(String fileName, HttpServletResponse response) { + File info = super.getOne(Wrappers.lambdaQuery().eq(File::getFileName, fileName), false); + + if (info == null) { + throw new ServiceException("下载文件出错"); + } + + String path = "." + info.getFilePath() + info.getFileName() + info.getFileSuffix(); + String osName = System.getProperties().getProperty("os.name"); + + if (osName.contains("Windows")) { + path = "C:/" + path; + } + + java.io.File file = new java.io.File(path); + if (!file.exists()) { + throw new ServiceException("下载文件出错"); + } + + try { + String realName = info.getFileOldName(); + // 3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名URLEncoder.encode编码,否则有可能乱码 + response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(realName.getBytes(), "ISO8859-1") + "\""); + response.setCharacterEncoding("UTF-8"); + // 4. 获取下载文件的输入流 + FileInputStream in = new FileInputStream(path); + // 5. 创建缓冲区 + int len = 0; + byte[] buffer = new byte[1024]; + // 6. 获取OutputStream对象 + ServletOutputStream out = response.getOutputStream(); + // 7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端! + while ((len = in.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + in.close(); + out.close(); + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException("下载文件出错"); + } + + } }