На вашем месте я бы использовал Spring Content .Тогда вам не нужно беспокоиться о том, как реализовать какой-либо из этого кода, и у вас будет гораздо больше возможностей для хранения ваших изображений.
Добавить в приложение довольно просто.
pom.xml
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-fs</artifactId>
<version>0.0.11</version>
</dependency>
StoreConfig.java
@Configuration
@EnableFilesystemStores
public class EnableFilesystemStoresConfig {
@Bean
File filesystemRoot() {
try {
return new File("/path/to/your/images");
} catch (IOException ioe) {}
return null;
}
@Bean
FileSystemResourceLoader fileSystemResourceLoader() {
return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
}
}
ImageStore.java
public interface ImageStore extends Store<String> {
}
Вот и все.ImageStore по сути является Spring ResourceLoader, поэтому все, что вам нужно сделать, это автоматически подключить его, чтобы использовать его.Зависимость spring-content-fs
заставит Spring Content внедрить реализацию на основе файловой системы от вашего имени:
ImageStoreTest.java
@RunWith(...)
public class ImageStoreTest {
@Autowired
private DocumentStore store;
@Test
public void sample() {
InputStream is = getImageStream();
Resource r = store.getResource("/some-image.jpg");
OutputStream os = ((WritableResource)r).getOutputStream();
IOUtils.copy(is, os);
is.close();
os.close();
}
public InputStream getImageStream() {
...
}
}
Если вы хотите сохранитьвместо изображений в базе данных или в S3, все, что вам нужно сделать, это изменить зависимость на ту, которая вам нужна, и обновить @Configuration
, чтобы добавить сведения о соединении для этого конкретного типа хранилища.Справочные руководства находятся внизу этой страницы .
Поскольку вы используете spring web-mvc, я предполагаю, что у вас есть REST API, так что вы можете пойти еще дальше.Добавьте эту зависимость:
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest</artifactId>
<version>0.0.11</version>
</dependency>
Эта @Import
в ваш StoreConfig.java:
@Configuration
@EnableFilesystemStores
@Import(RestConfiguration.class)
public class EnableFilesystemStoresConfig {
Эта @StoreRestResource
аннотация в вашем ImageStore.
ImageStore.java
@StoreRestResource(path="images")
public interface ImageStore extends Store<String> {
}
Теперь у вас будет полнофункциональный (POST, PUT, GET, DELETE) REST-сервис изображений на /images
, который будет использовать ваш ImageStore для хранения ваших изображений в/path/to/your/images
.
Итак ...
curl --upload-file example-image.jpg /images/example-image.jpg
загрузит example-image.jpg и сохранит его в /path/to/your/images/example-image.jpg
на вашем сервере, затем:
GET /images/example-image.jpg
вернется загрузить его.
HTH