不同Spring版本 方式不一样
第一种
String path = this.getClass().getClassLoader().getResource("").getPath() .concat("files/a.txt");
path = URLDecoder.decode(path);
File file = new File(path);
第二种
ClassPathResource classPathResource = new ClassPathResource("files/a.txt");
File file = classPathResource.getFile(); // 获取文件对象
第三种 获取输入流,在转为File
try {
// 获取资源文件的输入流
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("excel-templates/ComplexWeeklyPersonDayEfficiency.xlsx");
// 创建临时文件
File tempFile = File.createTempFile("ComplexWeeklyPersonDayEfficiency", ".xlsx");
// 将输入流内容写入到临时文件
FileCopyUtils.copy(inputStream, new FileOutputStream(tempFile));
// 输出临时文件的路径
System.out.println("临时文件路径:" + tempFile.getAbsolutePath());
// 可以返回 tempFile 对象,进行后续处理
} catch (IOException e) {
e.printStackTrace();
}
第四种
前面两种大多数情况 打包成jar运行 都是获取不到文件,war好像可以
示例
// 获取 resources 文件流
Resource classPathResource = new ClassPathResource("/static/test.txt");
File file = classPathResource.getFile();
// 下面代码 是 将 File对象输出给浏览器 无关代码
System.out.printf("文件是否存在: %s%n", file.exists());
// 将 file对象通过流输出给浏览器....
// 示例 使用 FileChannel
HttpServletRequest request = .....;
HttpServletResponse response = .....;
String type = request.getHeader("User-Agent").toLowerCase();
String charsetCode = "UTF-8";
if (type.indexOf("firefox") > 0 || type.indexOf("chrome") > 0) {
fileName = new String(fileName.getBytes(charsetCode), "iso8859-1");
} else {
fileName = URLEncoder.encode(fileName, charsetCode);
}
// 设置响应的头部信息
response.setHeader("content-disposition", "attachment;filename=" + fileName);
// 设置响应内容的类型
MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
String mimeType = fileTypeMap.getContentType(file.getName());
response.setContentType(mimeType + "; charset=" + charsetCode);
// 设置响应内容的长度
response.setContentLength((int) file.length());
response.setHeader("Content-Length", String.valueOf(file.length()));
// 通过文件管道输出文件
WritableByteChannel writableByteChannel = Channels.newChannel(response.getOutputStream());
FileChannel fileChannel = new FileInputStream(file.getAbsolutePath()).getChannel();
fileChannel.transferTo(0, fileChannel.size(), writableByteChannel);
fileChannel.close();
writableByteChannel.close();