现在我们在postgresql数据库中保存文件,并使用我们实体中的byte[]
字段映射该内容。我需要调查一下是否可以
将内容数据直接从数据库流式传输到HTTP输出流,并以相反的方式执行相同操作,以便使用jpa Blob
数据类型将二进制数据从HTTP传输到数据库。我知道Blob
有方法getBinaryStream
和setBinaryStream
因此它可能有效,我们不需要将数据保存到内存中。
我关注的是数据库事务,因为我们将实体映射到DTO,第二件事是破坏Http请求和数据可能在某些时候丢失。
是否有人对该解决方案有任何经验?
答案 0 :(得分:0)
从BLOB流读取数据的解决方案:
通过将OutputStream(由servlet容器提供)传递到事务方法来传输现有BLOB数据,该方法将实体blob数据从内部事务写入流。请注意,在写入数据之前,响应的内容类型设置为。
public class Attachment {
private java.sql.Blob data;
public java.sql.Blob getData() { return data; }
}
@Transactional(readOnly = true)
public void copyContentsTo(long attachmentId, OutputStream outputStream) throws IOException {
Attachment dbAttachment = attachmentRepository.findOne(attachmentId);
try (InputStream is = dbAttachment.getData().getBinaryStream()) {
IOUtils.copy(is, outputStream);
} catch (SQLException e) {
throw new ParameterException("Cannot extract BLOB for attachment #" + attachmentId, e);
}
}
@GetMapping(value = "/api/project-attachment/{attachment-id}/content")
@ResponseStatus(HttpStatus.OK)
public void getAttachmentContent(
@PathVariable("attachment-id") long attachmentId,
HttpServletResponse response,
OutputStream stream) throws IOException {
response.setContentType(getMime(attachmentId));
attachmentService.copyContentsTo(attachmentId, stream);
}
答案 1 :(得分:0)
Lucasz,JPA的Spring Content完全按照你的要求行事。旨在使创建处理内容(文档,图像,视频等)的Spring应用程序变得非常容易。它支持一系列后端存储,其中一个是关系数据库,显然它们使用BLOB。
此JPA模块将上传的文件从请求输入流直接流式传输到数据库,反之亦然,因此它永远不会将整个文件存储在内存中,这显然会导致非常大的文件出现问题。
这样可以避免在@ tequilacat的答案中编写任何代码。
可能值得一看。