Вы можете использовать Spring Content S3 . Это скроет детали реализации, поэтому вам не нужно о них беспокоиться.
Существуют альтернативные варианты Spring Boot, но поскольку вы не используете Spring Boot, добавьте следующую зависимость в ваш pom.xml
pom.xml
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-s3</artifactId>
<version>0.0.11</version>
</dependency>
Добавьте следующую конфигурацию, которая создает компонент SimpleStorageResourceLoader:
@Configuration
@EnableS3Stores
public class S3Config {
@Autowired
private Environment env;
public Region region() {
return Region.getRegion(Regions.fromName(env.getProperty("AWS_REGION")));
}
@Bean
public BasicAWSCredentials basicAWSCredentials() {
return new BasicAWSCredentials(env.getProperty("AWS_ACCESS_KEY_ID"), env.getProperty("AWS_SECRET_KEY"));
}
@Bean
public AmazonS3 client(AWSCredentials awsCredentials) {
AmazonS3Client amazonS3Client = new AmazonS3Client(awsCredentials);
amazonS3Client.setRegion(region());
return amazonS3Client;
}
@Bean
public SimpleStorageResourceLoader simpleStorageResourceLoader(AmazonS3 client) {
return new SimpleStorageResourceLoader(client);
}
}
Создать "Магазин":
S3Store.java
public interface S3Store extends Store<String> {
}
Подключите этот магазин туда, куда вам нужно загрузить ресурсы:
@Autowired
private S3Store store;
WritableResource r = (WritableResource)store.getResource(getId());
InputStream is = // plug your input stream in here
OutputStream os = r.getOutputStream();
IOUtils.copy(is, os);
is.close();
os.close();
Когда ваше приложение запускается, оно увидит зависимость от spring-content-s3
и вашего S3Store
интерфейса и предоставит вам реализацию, поэтому вам не нужно беспокоиться о реализации этого самостоятельно.
Если вы пишете какое-то веб-приложение или микросервис и вам нужен REST API, вы также можете добавить эту зависимость:
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest</artifactId>
<version>0.0.11</version>
</dependency>
Обновите S3Config.java
следующим образом:
@Configuration
@EnableS3Stores
@Import(RestConfiguration.class)
public class S3Config {
...
Обновите ваш магазин следующим образом:
S3Store.java
@StoreRestResource(path="s3docs")
public interface S3Store extends Store<String> {
}
Теперь, когда ваше приложение запускается, оно увидит ваш Store
интерфейс, а также внедрит реализацию @Controller
, которая перенаправит запрос REST в ваш магазин. Это заменяет код автопроводки, приведенный выше, очевидно.
Тогда:
curl -X POST /s3docs/example-doc
с запросом multipart / form-data сохранит изображение в s3.
curl /s3docs/example-doc
получит его снова и так далее. Кстати, этот контроллер поддерживает полное CRUD и потоковое видео.
Если вы хотите связать этот «контент» с сущностью JPA или чем-то в этом роде, вы можете использовать расширение S3Store AssociateStore
или ContentStore
, и у вас есть дополнительные доступные методы, которые предоставляют связи.
Есть несколько руководств по началу работы здесь . Справочное руководство по s3 здесь . И здесь есть обучающее видео здесь . Кодовый бит начинается примерно на полпути.
НТН