From 5a7486e9893a706ed464e3197c9711286b077896 Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期四, 26 六月 2025 11:12:28 +0800 Subject: [PATCH] 文件导入 --- ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java | 83 ++++++++++++++++++++++++++++++++++++++++- 1 files changed, 80 insertions(+), 3 deletions(-) diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java index 90d1020..0f5f3f5 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java @@ -39,14 +39,23 @@ import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Value; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; + import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.IOException; import java.math.BigDecimal; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; @@ -622,7 +631,7 @@ * @param file * @return */ - @PostMapping("/upload") + /* @PostMapping("/upload") public R upload(MultipartFile file){ String s = null; try { @@ -631,9 +640,77 @@ throw new RuntimeException(e); } return R.ok(s); + }*/ + + private static final String FILE_DIRECTORY = "/var/files/ldf_files"; // Linux路径 +// private static final String FILE_DIRECTORY = "E://ldf_files"; // Linux路径 + + @PostMapping("/upload") + public R handleFileUpload(@RequestParam("file") MultipartFile file) { + if (file.isEmpty()) { + return R.fail("请选择一个文件上传"); + } + try { + // 1. 构建日期目录路径(格式:/年/月/日) + LocalDate today = LocalDate.now(); + String datePath = String.format("/%d/%02d/%02d", + today.getYear(), today.getMonthValue(), today.getDayOfMonth()); + + // 2. 完整目标目录路径 + String fullDirPath = FILE_DIRECTORY + datePath; + File targetDir = new File(fullDirPath); + + // 3. 自动创建目录(如果不存在) + if (!targetDir.exists()) { + targetDir.mkdirs(); // 递归创建所有父目录 + } + String UUID= java.util.UUID.randomUUID().toString(); + // 4. 保存文件 + String filePath = fullDirPath + "/" +UUID+ file.getOriginalFilename(); + File targetFile = new File(filePath); + file.transferTo(targetFile); + // 5. 返回可访问的URL(修正路径分隔符为Web格式) + return R.ok("http://zjrqxny.com/account/app-user/download" + datePath + "/" + UUID+file.getOriginalFilename()); + } catch (IOException e) { + e.printStackTrace(); + return R.fail("上传文件失败"); + } } - - + @GetMapping("/download/{year}/{month}/{day}/{fileName:.+}") + @ResponseBody + public ResponseEntity<org.springframework.core.io.Resource> downloadFile( @PathVariable String year, + @PathVariable String month, + @PathVariable String day, + @PathVariable String fileName) { + System.out.println("下载文件名:"+fileName); + try { + // 1. 解码文件名 + String decodedFileName = URLDecoder.decode(fileName, "UTF-8"); + + + java.nio.file.Path filePath = java.nio.file.Paths.get(FILE_DIRECTORY, year, month, day, decodedFileName).normalize(); + org.springframework.core.io.Resource resource = new org.springframework.core.io.UrlResource(filePath.toUri()); + if (resource.exists() || resource.isReadable()) { + // 5. 设置下载头(兼容所有浏览器) + String contentDisposition = "attachment; filename=\"" + decodedFileName + "\"; " + + "filename*=UTF-8''" + URLEncoder.encode(decodedFileName, "UTF-8").replace("+", "%20"); + + return ResponseEntity.ok() + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) + .body(resource); + + } else { + return ResponseEntity.notFound().build(); + } + } catch (IOException ex) { + ex.printStackTrace(); + return ResponseEntity.status(500).build(); + } + } + + + /** * 清空绑定门店的用户门店数据 -- Gitblit v1.7.1