You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring文件下载本地正常服务器找不到文件,求路径配置方案

问题根源

本地开发时,src/main/resources下的文件是磁盘上的真实文件,用相对路径能直接访问,但部署到Tomcat后,这些文件会被打包进WAR包,解压后存放在WEB-INF/classes目录下,此时用File类直接访问磁盘路径会失效——服务器上不存在你本地的项目路径结构,也不会以Tomcat的bin目录为基准去匹配你的相对路径。

正确解决方案

不要用File类直接读取路径,改用Spring提供的ClassPathResource从classpath加载资源,它会自动适配本地和服务器的环境:

// 路径从src/main/resources下的内容开始写,不需要加src/main/resources前缀
ClassPathResource resource = new ClassPathResource("static/resource/upload/ctgryItem.xlsx");
InputStream inputStream = resource.getInputStream();
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);

// 后续文件名编码、响应头设置代码不变,建议优化编码方式
String outputFileName = URLEncoder.encode(resource.getFilename(), "UTF-8");
response.setHeader("Set-Cookie", "fileDownload=true; path=/");
response.setHeader("Content-Disposition", "attachment; filename=\"" + outputFileName + "\"");
workbook.write(response.getOutputStream());

// 记得关闭流,推荐用try-with-resources自动处理
inputStream.close();
workbook.close();
关键说明
  • 路径写法:static/resource/upload/ctgryItem.xlsx对应你本地src/main/resources/static/resource/upload/ctgryItem.xlsx,因为打包后src/main/resources下的内容会被放到classpath根目录。
  • 如果是动态上传的文件(不是打包时就存在的),绝对不能放在resources里——打包后这个目录的内容是固定的。这种情况要配置服务器上的绝对路径(比如/opt/tomcat/app_uploads/),上传和下载都用这个绝对路径,同时要给Tomcat分配该目录的读写权限。
  • 文件名编码用URLEncoder.encode比手动转码更稳定,能避免不同浏览器出现乱码问题。

内容的提问来源于stack exchange,提问作者curious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:50:00