保存图像的正确位置(弹簧/弹性)

时间:2018-12-24 18:14:40

标签: java spring jelastic

我正竭力实现用户个人资料功能,首先我发现了一个上传照片的示例,并将其保存到app文件夹中,例如home\jelastic\app\my_folder,但存在两个问题:

1)如果我需要更新应用程序并上传新的版本,我想保存此图像,但是我丢失了这些数据

2)我无法读取照片(由于某些原因输入流为空)

public @ResponseBody byte[] getImageWithMediaType() throws IOException {
        InputStream in = getClass()
                .getResourceAsStream(storageService.getPath() + "/1544717586066.jpeg");
        return ByteStreams.toByteArray(in);
    }

那么,在Jelastic上保存/读取照片的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

您为什么不看Spring Content。旨在完全按照您的意图进行操作。

假设您正在使用Spring Data存储每个用户配置文件,则可以按如下所示将其添加到项目中:

  

pom.xml

   <!-- Java API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-fs-boot-starter</artifactId>
      <version>0.4.0</version>
   </dependency>

   <!-- REST API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-rest-boot-starter</artifactId>
      <version>0.4.0</version>
   </dependency>
  

FilesystemConfiguration.java

@Configuration
public class FilesystemConfiguration {

    @Bean
    File filesystemRoot() {
        try {
            return new File("/path/to/your/user/profile/image/store");
        } catch (IOException ioe) {}
        return null;
    }

    @Bean
    FileSystemResourceLoader fileSystemResourceLoader() {
        return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
    }
}
  

User.java

@Entity
public class User {
   @Id
   @GeneratedValue
   private long id;

   ...other existing fields...

   @ContentId
   private String contentId;

   @ContentLength
   private long contentLength = 0L;

   @MimeType
   private String mimeType = "text/plain";

   ...
}
  

UserContentStore.java

@StoreRestResource(path="userProfileImages")
public interface UserContentStore extends ContentStore<User, String> {
}

这是获取REST端点所需要做的一切,这些端点将使您可以存储和检索与每个用户关联的内容。实际工作方式与Spring Data非常相似。当您的应用程序启动时,Spring Content将看到spring-content-fs-boot-starter依赖性,并且知道您要在文件系统上存储内容。它还将注入UserContentStore接口的基于文件系统的实现。它还将看到spring-content-rest-boot-starter并将注入与内容存储接口对话的REST端点。意味着您不必自己编写任何代码。

例如,

curl -X POST /userProfileImages/{userId} -F "file=@/path/to/image.jpg"

会将图像存储在文件系统上,并将其与ID为userId的用户实体相关联。

curl /userProfileImages/{userId}

将再次获取它,依此类推...实际上也完全支持完整的CRUD和视频流。

您还可以通过将spring-content-fs-boot-starter依赖项交换为适当的Spring Content Storage模块,来决定将内容存储在数据库(如有人评论)或S3中的其他位置。每种存储类型的示例均为here

答案 1 :(得分:2)

如果您redeploy the whole container,则以下文章可能有助于组织媒体文件的存储:5 Ways to Store Data with ContainersData Storage Container Overview。一般的想法是制作一个卷(本地或远程)。

如果通过Deployment Manager重新部署应用程序,则只需将文件存储在应用程序文件夹之外,例如/home/jelastic/myfiles。但是,如果您要存储大量数据,则最好使用一个单独的数据存储容器。