Я пытаюсь реализовать функциональность профиля пользователя, сначала я нашел пример загрузки фотографий, и он сохраняет его в папку приложения, например home\jelastic\app\my_folder, но есть 2 проблемы:
1) если мне нужно обновить приложение и загрузить новую сборку, я хочу сохранить эти изображения, но я потеряю эти данные
2) я не могу читать фотографии (входной поток по какой-то причине нулевой)
public @ResponseBody byte[] getImageWithMediaType() throws IOException {
InputStream in = getClass()
.getResourceAsStream(storageService.getPath() + "/1544717586066.jpeg");
return ByteStreams.toByteArray(in);
}
Итак, как правильно сохранять / читать фотографии на jelastic?
Спасибо. я думал об этом, но, похоже, лучший способ - использовать хранилище файлов: stackoverflow.com/questions/3748/…
Хорошо, следуйте этому совету - и используйте базу данных для хранения метаданных для изображений.




Почему бы тебе не взглянуть на Весенний контент. Это сделано для того, чтобы делать именно то, что вы пытаетесь сделать.
Предполагая, что вы используете 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"
сохранит изображение в файловой системе и свяжет его с пользовательской сущностью с идентификатором userId.
curl /userProfileImages/{userId}
получит его снова и так далее ... на самом деле поддерживает полный CRUD и потоковое видео.
Вы также можете решить сохранить содержимое в другом месте, например, в базе данных (как кто-то прокомментировал) или в S3, заменив зависимость spring-content-fs-boot-starter на соответствующий модуль Spring Content Storage. Примеры для каждого типа хранилища: здесь.
Я бы сохранил его в базе данных как blob