Вы задаете довольно много вопросов по одному вопросу здесь.По сути, вы спрашиваете, как загрузить файлы из браузера / клиента на сервер на базе Spring, как обработать эту загрузку на сервере на основе Spring, чтобы сохранить ее в базе данных Postgresql и связать ее с моей сущностью User, чтобыЯ могу получить это снова позже.
Итак, давайте ответим на все это для вас.
Давайте начнем со стороны клиента.Этот код загрузит выбранный файл в существующий ресурс: -
index.html
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<script>
function upload() {
var data = new FormData();
data.append('file', jQuery('#file')[0].files[0]);
jQuery.ajax({
url: '/userImage/userId',
data: data,
cache: false,
contentType: false,
processData: false,
method: 'POST',
type: 'POST', // For jQuery < 1.9
success: function(data){
alert(data);
}
});
}
</script>
</head>
<body>
<div>
<h1>New File</h1>
<input type="file" id="file" name="file"/>
<button onclick="upload()">Upload</button>
</div>
</body>
</html>
Теперь обратим наше внимание на серверную часть Spring-bsed.Чтобы абстрагироваться от реализации того, как именно сохранить загруженный файл в базе данных (и как обновить его, как извлечь его, как удалить и т. Д.), Я бы использовал Spring Content в противном случаеу вас есть много кода для написания того, что Spring Content уже реализует для вас.
Итак, добавьте следующие зависимости:
pom.xml
<dependency>
<groupId>com.github.paulcwarren</groupId>
<artifactId>spring-content-jpa</artifactId>
<version>0.1.0</version> // 0.0.11 for Spring Boot 1 dependencies
</dependency>
Сконфигурируйте создание схемы базы данных в одном из ваших классов конфигурации:
Config.java
@Configuration
@EnableJpaStores // enable JPA-based storage
public class PostgresqlTestConfig {
...dataSource and entityManager, etc beans...
@Value("/org/springframework/content/jpa/schema-drop-postgresql.sql")
private Resource dropReopsitoryTables;
@Value("/org/springframework/content/jpa/schema-postgresql.sql")
private Resource dataReopsitorySchema;
@Bean
DataSourceInitializer datasourceInitializer() {
ResourceDatabasePopulator databasePopulator =
new ResourceDatabasePopulator();
databasePopulator.addScript(dropReopsitoryTables);
databasePopulator.addScript(dataReopsitorySchema);
databasePopulator.setIgnoreFailedDrops(true);
DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource());
initializer.setDatabasePopulator(databasePopulator);
return initializer;
}
}
Свяжите контент с вашей сущностью User:
User.java
@Entity
public class User {
...existing fields...
@ContentId private String contentId;
private String mimeType;
}
Создайте хранилище UserStore:
UserImageStore.java
public interface UserImageStore extends AssociativeStore<User, String> {
}
Обновите свойконтроллер для обработки загрузки файлов, сохранения их в базе данных и связывания этого сохраненного изображения с вашей сущностью:
UserController.java
@Autowired
private UserImageStore store;
...
@RequestMapping(value="/userImage/{userId}", method = RequestMethod.POST)
public ResponseEntity<?> setContent(@PathVariable("userId") Long id, @RequestParam("file") MultipartFile file)
throws IOException {
User user = // fetch your existing user here
user.setMimeType(file.getContentType());
String originalFilename = file.getOriginalFilename();
InputStream is = file.getInputStream();
OutputStream os = ((WritableResource)store.getResource(originalFilename)).getOutputStream();
IOUtils.copyLarge(is, os);
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
// associate content (this will update the @ContentId field)
store.associate(user, originalFilename);
// save updated content-related info
save(user);
return new ResponseEntity<Object>(HttpStatus.OK);
}
return null;
@RequestMapping(value="/userImage/{userId}", method = RequestMethod.GET)
public ResponseEntity<?> getContent(@PathVariable("userId") Long id) {
User user = // fetch your existing user here
Resource r = store.getResource(user.getContentId());
HttpHeaders headers = new HttpHeaders();
headers.setContentLength(r.getContentLength());
headers.set("Content-Type", user.getMimeType());
return new ResponseEntity<Object>(r, headers, HttpStatus.OK);
}
return null;
}
Вот и все.Поэтому здесь произойдет следующее: когда ваше приложение запускается, оно видит зависимость от spring-content-jpa
, а затем видит ваше UserImageStore
.Предполагается, что вы хотите хранить изображения (BLOB) в jpa, и внедряет реализацию JPA интерфейса UserImageStore
, что означает, что вам не нужно писать его самостоятельно.Spring Content скрывает реализацию, но предоставляет относительно простой интерфейс (фактически основанный на Spring Resource), который составляет @Autowired
в вашем контроллере, делая эту реализацию простой.
В любом случае, дайте мне знать, если вы используете Spring Data или Spring Boot, и я могу обновить этот ответ, чтобы он был более актуальным для вас.
HTH