Spring 内容 1.2.5 JPA(Postgres) .docx 文件变为 zip 存档
Spring Content 1.2.5 JPA(Postgres) .docx file mutates to zip archive
已保存 mimeType 为“application/vnd.openxmlformats-officedocument.wordprocessingml.document”的“.docx”文件。但是当我在 Spring 内容中访问它的端点并下载它时,它不完全是 Word 文档,而是 Zip 存档(application/zip ). Spring Content 1.2.5 支持“.docx”文件,我们该如何解决?
重现问题的演示项目(附加.docx文件):
https://github.com/leonaugust/docx-problem
编辑
虽然我知道生成的文件毕竟是 docx,我们可以选择将其作为 Word 文档打开,但是有什么方法可以减少客户的混淆并 return 返回为“.docx”格式?在我的情况下,很可能会以这种格式发送大量文件
因为你在类路径上有 spring-content-rest
并使用 @StoreRestResource
注释,我假设你正在使用它来获取你的内容?如果不是这样,请告诉我,我会进行编辑。
有几个注释,如果存在于实体上,spring 内容剩余 post/put 端点将为您设置,然后由 GET 端点稍后使用; @MimeType
和 @OriginalFileName
.
如果您将这些注释添加到您的实体并在您的 post 端点中适当地设置它们,那么:-
@PostMapping
public UUID create(@RequestParam("file") MultipartFile multipartFile) {
File file = new File();
file.setMimeType(multipartFile.getContentType());
store.setContent(file, multipartFile.getResource());
file.setMimeType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
file.setOriginalFileName(multipartFile.getOriginalFilename());
UUID id = repository.save(file).getId();
log.info("id {}", id);
return id;
}
当您的客户端通过 Spring Content REST 端点获取内容(我假设)时,它将设置以下 headers:
- Content-type header
- content-dispostionform-data附件header
关于回复。
两者都会指示浏览器应用程序适当地处理内容。
这应该允许您从浏览器发出以下获取请求。
curl -H 'Accept: application/vnd.openxmlformats-officedocument.wordprocessingml.document' http://localhost:8080/storage/b9ca6fbe-dede-4a51-b444-9e22b798e922
并且它应该将附件下载为 test.docx
另外,我很想知道您为什么添加自己的“创建”端点,而不是使用 Spring 数据 REST/Spring 内容 REST 端点。它会自动为你做这件事。我认为这是因为您不想使用 Spring Data REST?
已保存 mimeType 为“application/vnd.openxmlformats-officedocument.wordprocessingml.document”的“.docx”文件。但是当我在 Spring 内容中访问它的端点并下载它时,它不完全是 Word 文档,而是 Zip 存档(application/zip ). Spring Content 1.2.5 支持“.docx”文件,我们该如何解决?
重现问题的演示项目(附加.docx文件): https://github.com/leonaugust/docx-problem
编辑
虽然我知道生成的文件毕竟是 docx,我们可以选择将其作为 Word 文档打开,但是有什么方法可以减少客户的混淆并 return 返回为“.docx”格式?在我的情况下,很可能会以这种格式发送大量文件
因为你在类路径上有 spring-content-rest
并使用 @StoreRestResource
注释,我假设你正在使用它来获取你的内容?如果不是这样,请告诉我,我会进行编辑。
有几个注释,如果存在于实体上,spring 内容剩余 post/put 端点将为您设置,然后由 GET 端点稍后使用; @MimeType
和 @OriginalFileName
.
如果您将这些注释添加到您的实体并在您的 post 端点中适当地设置它们,那么:-
@PostMapping
public UUID create(@RequestParam("file") MultipartFile multipartFile) {
File file = new File();
file.setMimeType(multipartFile.getContentType());
store.setContent(file, multipartFile.getResource());
file.setMimeType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
file.setOriginalFileName(multipartFile.getOriginalFilename());
UUID id = repository.save(file).getId();
log.info("id {}", id);
return id;
}
当您的客户端通过 Spring Content REST 端点获取内容(我假设)时,它将设置以下 headers:
- Content-type header
- content-dispostionform-data附件header
关于回复。
两者都会指示浏览器应用程序适当地处理内容。
这应该允许您从浏览器发出以下获取请求。
curl -H 'Accept: application/vnd.openxmlformats-officedocument.wordprocessingml.document' http://localhost:8080/storage/b9ca6fbe-dede-4a51-b444-9e22b798e922
并且它应该将附件下载为 test.docx
另外,我很想知道您为什么添加自己的“创建”端点,而不是使用 Spring 数据 REST/Spring 内容 REST 端点。它会自动为你做这件事。我认为这是因为您不想使用 Spring Data REST?