如何在javascript中使用$. AJAX 保存zip二进制数据

gmol1639  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(161)

我有问题,当我运行脚本,它可以下载zip文件,但当打开zip文件时,它显示错误“存档是未知的格式或损坏”
在写这个脚本之前,我尝试了Postman中的Webservice,并使用保存响应“保存到文件”,我可以获得zip文件并可以使用它
这是我的代码
javascript:

<a id="download-link" style="display: none;">Download</a>

<button id="get-token-button">Get OAuth 2.0 Token</button>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

<script>

    $("#get-token-button").click(function() {
      $.ajax({
        url: "https://localhost:9445/test-org/api-test/oauth-test-provider/oauth2/token",
        type: "POST",
        data: {
          grant_type: "client_credentials",
          client_id: "client_id",
          client_secret: "client_secret",
          scope: "scope"
        },
        success: function(response) {       
          alert("Token: " + response.access_token);
          $.ajax({
        url: "https://localhost:9445/test-org/api-test/API/v1/ReceiptService/getReceiptByDataDate",
        type: "POST",
        headers: {
          "Authorization": "Bearer " + response.access_token
        },
        data: JSON.stringify({
          "dataDate": "Date",
          "ogaTaxNum": "TaxNum"
        }),
        contentType: "application/json",
        responseType: "arraybuffer",
        success: function(response) {
          alert(response);
          // If the request is successful, create a blob from the response and create a download link
          var blob = new Blob([response], {type: "application/zip"});
          var url = window.URL.createObjectURL(blob);
          $("#download-link").attr("href", url);
          $("#download-link").attr("download", "file.zip");
          $("#download-link").show();
        },
        error: function(jqXHR, textStatus, errorThrown) {
          // If the request fails, display an error message
          alert("Download failed: " + errorThrown);
        }
      });
    },
    error: function(jqXHR, textStatus, errorThrown) {
      // If the request fails, display an error message
      alert("Token request failed: " + errorThrown);
        }
      });
    });
  </script>

我想解决如何下载zip文件

gcuhipw9

gcuhipw91#

在这种情况下,response是一个字符串。默认情况下,它尝试将响应解释为UTF8,这可能会损坏某些数据(因为源数据是二进制的)。为了防止这样破坏数据,您可以将mimeType: 'text/plain; charset=x-user-defined'添加到 AJAX 设置中。
此外,在创建blob时,字符串中的字符应该Map到0到255之间的值,这可以通过Uint8Array.from(response, a => a.charCodeAt(0))完成。所以,你可以像这样创建blob:

var blob = new Blob([Uint8Array.from(response, a => a.charCodeAt(0))], {type: "application/zip"});

编辑:当我在寻找避免旧的x-user-defined技巧的方法时,我遇到了another thread。因此,使用jQuery 3可以完全避免它,使用:

xhrFields: {responseType: 'blob'}

在设置和响应中可以使用以下方式:

var url = window.URL.createObjectURL(response);

在这里,您甚至不必再手动创建blob,因为响应已经是一个blob。
Another answer to that thread向您展示了如何通过更改xhr:设置将其设置为仅用于成功响应的blob。

相关问题