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
相关产品推荐
相关产品推荐

