REST загрузка / загрузка большого файла с помощью Spring boot / JPA, Postgres

#postgresql #spring-boot #spring-data-jpa #bytea

#postgresql #spring-boot #spring-data-jpa #bytea

Вопрос:

Я пытаюсь загрузить файл размером ~ 700 МБ и загрузить его через REST API в Spring boot с Postgres в качестве базы данных. Я знаю, что Postgres — это не тот путь, но, тем не менее, я пытаюсь решить его как есть.

Загрузка REST работает после того, как я добавил -Xmx2024m в виртуальную машину во время работы. Загрузка REST выдает ошибку при вызове uploadObjectEntityRepository.findById(id) :

 Caused by: org.postgresql.util.PSQLException: ERROR: invalid memory alloc request size 1381847031
  

Ошибка будет означать, что данные загружены, но служба загрузки завершилась чисто. Во время загрузки в журнале Postgres также не было ошибок. В базе данных поле data имеет тип bytea .

В чем может быть проблема?

Сокращенный код:

 @Entity
@Table(name = "UploadObjectEntity")
public class UploadObjectEntity implements Serializable {
    ...
    @Lob
    @Column(name = "data", nullable = false)
    private byte[] data;
    ...
}

@PostMapping("/upload")
public ResponseEntity<UploadObject> upload(@RequestPart MultipartFile file){
    ...
    UploadObject o = customService.saveUploadObject(file);
    ...
}

@RequestMapping(value = "/download/{id}", method = RequestMethod.GET)
public void getByteArray(@PathVariable("id") Long id, HttpServletResponse response) {
    UploadObject uploadObject = customService.load(id);
    ByteSource byteSource = ByteSource.wrap(uploadObject.getData());

    InputStream stream = byteSource.openStream();

    response.setContentType(...);
    response.setContentLength(...);
    IOUtils.copy(stream, response.getOutputStream());
}

//Custom Service
public UploadObject saveUploadObject(MultipartFile file) {
    ...
    UploadObjectEntity uploadObjectEntity = new UploadObjectEntity();
    uploadObjectEntity.setData(file.getBytes());
    ...
    uploadObjectEntity = uploadObjectEntityRepository.save(uploadObjectEntity);

    return uploadObjectEntityMapper.toDto(uploadObjectEntity);
}

public UploadObject load(Long id) {
    return uploadObjectEntityRepository.findById(id).map(uploadObjectEntityMapper::toDto);
}   
  

Ответ №1:

Добавьте свой код application.properties

 spring.http.multipart.max-file-size=1000MB
spring.http.multipart.max-request-size=1000MB