保存图像的正确位置 (spring/jelastic)
Right place to save images (spring/jelastic)
我正在努力实现用户配置文件功能,起初我找到了一个上传照片的示例,并将其保存到应用程序文件夹,如 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 上 save/read 照片的正确方法是什么?
你为什么不看一看 Spring Content。这旨在完全满足您的需求。
假设您正在使用 Spring 数据来存储每个用户配置文件,您可以按如下方式将其添加到您的项目中:
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 数据。当您的应用程序启动时 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 内容存储模块来存储在 S3 中。每种存储类型的示例是 here.
我正在努力实现用户配置文件功能,起初我找到了一个上传照片的示例,并将其保存到应用程序文件夹,如 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 上 save/read 照片的正确方法是什么?
你为什么不看一看 Spring Content。这旨在完全满足您的需求。
假设您正在使用 Spring 数据来存储每个用户配置文件,您可以按如下方式将其添加到您的项目中:
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 数据。当您的应用程序启动时 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 内容存储模块来存储在 S3 中。每种存储类型的示例是 here.