javascript - @POST 通过 Postman 从八位字节流生成正确的 .zip 存档,但通过 WebApp 生成无效的存档
问题描述
我在 JAVA 中有生成 .zip 的方法:
@POST
@Path("download")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Consumes(MediaType.APPLICATION_JSON)
@RequesterAccess(privileges = XXX})
public void downloadFiles(@Context HttpServletResponse resp, Request
req) {
resp.setContentType("application/octet-stream");
resp.setHeader(CONTENT_DISPOSITION_HEADER,
"attachment;filename="xxx.zip");
try {
service.downloadFiles(resp.getOutputStream(), req);
(...)
当我通过 Postman 执行 POST 并按保存和下载按钮时,我收到了有效的 .zip 存档。当我尝试使用 WebBrowser 和 JavaScript 制作的 UI 下载它时 - 我的存档损坏了。
请求和响应以及标头是相同的。
这是负责在 JS 中保存文件的代码:
saveFile(apiFunction: Observable<any>) {
apiFunction.subscribe(
data => {
let contentDisposition = data.headers.get('content-disposition') || '';
let matches = /filename=([^;]+)/ig.exec(contentDisposition);
let fileName = (...)
var blob = new Blob([data._body], {
type: 'application/octet-stream'
});
FileSaver.saveAs(blob, fileName);
}, error => {
(...)
在这两种情况下,POST 返回状态码:204。存档损坏的原因是什么?
编辑:我对 JS 了解不多,但我注意到 2 个 POST 之间的唯一区别是,在来自 JS 的 POST 请求之前,有一些 OPTIONS 请求对同一个端点发出。
解决方案
问题解决了。事实证明,该存档的条目路径以“/”开头,通过 Postman 在 Linux 上运行良好,但 Windows ZIP 需要相对路径,因此在 Windows 和浏览器中创建/读取存档不正确。
推荐阅读
- c# - 在 Wpf MVVMLight 中将按钮绑定到 RelayCommand
- android - Android Pie:反转 ScrollView 势头
- sql - 调试oracle程序
- python - 我可以将数据表悬停到 scattermapbox(plotly)上的某个位置吗?
- java - 线程“主”java.lang.UnsatisfiedLinkError 中的异常:org.opencv.imgcodecs.Imgcodecs.imread_0(Ljava/lang/String;I)J
- python - 连接字典中的键和值
- sql-server - SQL,一次性初始化游标,必须声明标量变量
- amazon-web-services - 使用机器学习的 QuickSight
- python - 具有重置索引的熊猫中 groupby 的时间复杂度
- node.js - 如何在续集中克隆/复制实例项/行