首页 > 解决方案 > @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 请求对同一个端点发出。

标签: javascriptjavaangularrequestzip

解决方案


问题解决了。事实证明,该存档的条目路径以“/”开头,通过 Postman 在 Linux 上运行良好,但 Windows ZIP 需要相对路径,因此在 Windows 和浏览器中创建/读取存档不正确。


推荐阅读