问题:
将要下载的文件存放在resource里,发现在本地开发的时候能够下载,但是将其发布到docker里却无法获取到文件。
解决思路:
在docker容器中程序打成了jar包,不要想着从jar包中读取文件。
所以在docker容器里创建一个路径,将文件复制进去,然后用FileInputStream读取此文件。
做法:
1.在pom文件中加上:
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
2.创建工具类:
@Slf4j
@Component
public class DocUtil {
//此路径是其余方法进行调用,且只须要加载一次
private static String sourceTemplatePath;
// 模板文件名称
private static String[] ftlArray = {"文件名称.xlsx"};
// resources下模板文件夹名称
private static String temPath = "excel/";
static {
//静态方法调用一次
sourceTemplatePath = createFtlFileByFtlArray();
}
// 获取临时文件路径
public String getSourceTemplatePath(){
return sourceTemplatePath;
}
//获取临时文件模板路径
public static String getRentalAgreementPath(){
return sourceTemplatePath+ ftlArray[0];
}
private static String createFtlFileByFtlArray() {
String path = "";
for (int i = 0; i < ftlArray.length; i++) {
path = createFtlFile(temPath, ftlArray[i]);
if (null == path) {
log.info("not copy success:" + ftlArray[i]);
}
}
return path;
}
private static String createFtlFile(String ftlPath, String ftlName) {
try {
//获取当前项目所在的绝对路径
String proFilePath = System.getProperty("user.dir");
log.info("project run path:" + proFilePath);
//获取模板下的路径
String newFilePath = proFilePath + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + ftlPath;
newFilePath = newFilePath.replace("/", File.separator);
log.info("newFilePath:" + newFilePath);
//检查项目运行时的src下的对应路径
File newFile = new File(newFilePath + ftlName);
if (newFile.isFile() && newFile.exists()) {
return newFilePath;
}
//当项目打成jar包会运行下面的代码,而且复制一份到src路径下(具体结构看下面图片)
InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(ftlPath + ftlName);
byte[] certData = IOUtils.toByteArray(certStream);
FileUtils.writeByteArrayToFile(newFile, certData);
return newFilePath;
} catch (IOException e) {
log.error("复制文件失败--> 异常信息:" + e);
}
return null;
}
}
3.获取流
InputStream fis = new FileInputStream(DocUtil.getRentalAgreementPath());
然后就可以下载了