Я думаю, вам нужно отправить запрос multipart / related , но в прошлый раз, когда я проверял Angular, это не поддерживалось.
В любом случае, вы реализуете гораздо больше кода, чем вам нужно. Почему бы вам не взглянуть на Spring Content . Это сделано для того, чтобы связать контент с объектами Spring Data, как вы пытаетесь сделать, используя ту же (или очень похожую модель программирования), что и Spring Data.
Вы можете добавить его в свой проект следующим образом:
pom.xml
<!-- Java API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-fs-boot-starter</artifactId>
<version>0.7.0</version>
</dependency>
<!-- REST API -->
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-rest-boot-starter</artifactId>
<version>0.7.0</version>
</dependency>
FilesystemConfiguration.java
@Configuration
public class FilesystemConfiguration {
@Bean
File filesystemRoot() {
try {
return new File("/path/to/your/product/images");
} catch (IOException ioe) {}
return null;
}
@Bean
FileSystemResourceLoader fileSystemResourceLoader() {
return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
}
}
Product.java
@Entity
public class Product {
@Id
@GeneratedValue
private long id;
...other existing fields...
@ContentId
private String contentId;
@ContentLength
private long contentLength = 0L;
@MimeType
private String mimeType = "text/plain";
...
}
ProductContentStore.java
@StoreRestResource(path="productImages")
public interface ProductContentStore extends ContentStore<Product, String> {
}
Это все, что вам нужно сделать, чтобы получить конечные точки REST, которые позволят вам хранить и извлекать контент, связанный с каждым продуктом. Как это на самом деле работает, очень похоже на Spring Data. Когда ваше приложение запустится, Spring Content увидит зависимости spring-content-fs-boot-starter
и будет знать, что вы хотите хранить контент в файловой системе. Он внедрит основанную на файловой системе реализацию интерфейса ProductContentStore
. Он также увидит spring-content-rest-boot-starter
и введет конечные точки REST, которые взаимодействуют с интерфейсом хранилища контента. Это означает, что вам не нужно писать этот код самостоятельно.
Так, например:
curl -X POST /productImages/{productId} -F "file=@/path/to/image.jpg"
сохранит изображение в файловой системе и свяжет его с сущностью продукта с идентификатором productId
.
curl /productImages/{productId}
будет извлекать его снова и так далее ... на самом деле поддерживает полный CRUD и потоковое видео. Кстати,
Вы также можете решить хранить содержимое в другом месте, например, в базе данных (как кто-то прокомментировал) или в S3, поменяв местами зависимость spring-content-fs-boot-starter
для соответствующего модуля Spring Content Storage. Примеры для каждого типа хранилища: здесь .
Итак, angular (и другие популярные интерфейсы) на момент написания статьи не поддерживают multipart/related
, что, на мой взгляд, является правильным типом запроса на загрузку контента, связанного с сущностями. Вместо этого Spring Content и вашему решению придется использовать отдельные запросы к; во-первых, чтобы создать объект, а во-вторых, связать контент с этим объектом.
НТН