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