首页 > 解决方案 > 部署后将文件存储在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

标签: javaspringspring-bootrest

解决方案


通常,当您部署应用程序(或使用 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。在控制器中,您通常不想这样做,而是让您的用户从给定的可用文件夹中访问(并因此下载)它。

我希望这有帮助 :)。


推荐阅读