java - 部署后将文件存储在spring boot资源文件夹中
问题描述
我已经部署了一个 spring-boot 应用程序 JAR 文件。现在,我想从android上传图像并将其存储在资源目录的myfolder中。但无法获取资源目录的路径。
错误是: java.io.FileNotFoundException: src/main/resources/static/myfolder/myimage.png (没有这样的文件或目录)
这是将文件存储在资源文件夹中的代码
private final String RESOURCE_PATH = "src/main/resources";
String filepath = "/myfolder/";
public String saveFile(byte[] bytes, String filepath, String filename) throws MalformedURLException, IOException {
File file = new File(RESOURCE_PATH + filepath + filename);
OutputStream out = new FileOutputStream(file);
try {
out.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
}
return file.getName();
}
更新:
这是我尝试过的
private final String RESOURCE_PATH = "config/";
controller class:
String filepath = "myfolder/";
String filename = "newfile.png"
public String saveFile(byte[] bytes, String filepath, String filename) throws MalformedURLException, IOException {
//reading old file
System.out.println(Files.readAllBytes(Paths.get("config","myfolder","oldfile.png"))); //gives noSuchFileException
//writing new file
File file = new File(RESOURCE_PATH + filepath + filename);
OutputStream out = new FileOutputStream(file); //FileNotFoundException
try {
out.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
}
return file.getName();
}
项目结构:
+springdemo-0.0.1-application.zip
+config
+myfolder
-oldfile.png
-application.properties
+lib
+springdemo-0.0.1.jar
+start.sh
-springdemo-0.0.1.jar //running this jar file
解决方案
通常,当您部署应用程序(或使用 Java 启动它)时,您会启动一个 JAR 文件。您没有资源文件夹。您也可以拥有一个并访问它,但肯定不会src/main/resources
。
当您构建最终工件(您的应用程序)时,它会创建一个 JAR(或 EAR 或 WAR)文件,并且您在src/main/resources
-folder 中的资源将被复制到输出目录并包含在最终工件中。运行应用程序时该文件夹根本不存在(假设您尝试独立运行它)。
在构建过程target/
中创建并包含类、资源、测试资源等(假设您使用 Maven 构建;如果您使用 Gradle、Ant 或手动构建,则略有不同)。
您可以做的是创建一个文件夹,例如docs
在您的最终工件旁边,给它适当的权限(chmod
/ chown
)并将您的应用程序输出文件放入该文件夹中。然后,该文件夹也应该存在于运行您的工件的目标计算机上,因此,如果不存在,则意味着该文件夹不存在,或者应用程序缺少读取/写入该文件夹的适当权限。
如果您需要更多详细信息,请随时询问。
更新:
要访问捆绑并因此在您的工件(例如final.jar
)中的资源,您应该能够使用例如以下内容来检索它:
testText = new String(ControllerClass.class.getResourceAsStream("/test.txt").readAllBytes());
这是假设您的test.txt
文件就在src/main/resources
您的 JAR 文件(或运行应用程序的目标文件夹)的根目录下并直接捆绑在其中。ControllerClass
是控制器,它正在访问文件。readAllBytes
正是这样做的:从文本文件中读取所有字节。要访问工件内的图像,您可能需要使用ImageIO
.
但是,如果您想访问未捆绑的外部文件,因此不在您的工件内,您可以使用File image = new File(...)
where...
将类似于"docs/image.png"
. docs
这将要求您在 JAR-artifact旁边创建一个名为的文件夹,并将文件image.png
放入其中。
当然,您也可以使用流,并且有各种有用的库可用于处理输入和输出流。
以下内容适用于 AWT,但如果您真的想访问图像的字节,它可以工作:ImageIO。在控制器中,您通常不想这样做,而是让您的用户从给定的可用文件夹中访问(并因此下载)它。
我希望这有帮助 :)。
推荐阅读
- firebase - 为什么firebase在退出后会抛出权限错误?
- sql - 选择按日期分组的一系列数字?
- git - 来自整个 git 存储库历史的原始代码总行数
- python - Plotly:如何使用 plotly express 在单迹散点图中显示图例?
- google-apps-script - 对 Google 脚本中的函数的 HTTP 请求
- pandas - 知道数据框中的哪一行与另一行相似
- python - 使用 Python 计算大文本中多词项的频率
- python - Python检查字符串是否在文档中
- javascript - 从 Google 表格中删除多列,避免昂贵的循环
- sql - 需要有关如何分组此表的想法