我有问题,当我运行脚本,它可以下载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文件
1条答案
按热度按时间gcuhipw91#
在这种情况下,
response
是一个字符串。默认情况下,它尝试将响应解释为UTF8,这可能会损坏某些数据(因为源数据是二进制的)。为了防止这样破坏数据,您可以将mimeType: 'text/plain; charset=x-user-defined'
添加到 AJAX 设置中。此外,在创建blob时,字符串中的字符应该Map到0到255之间的值,这可以通过
Uint8Array.from(response, a => a.charCodeAt(0))
完成。所以,你可以像这样创建blob:编辑:当我在寻找避免旧的
x-user-defined
技巧的方法时,我遇到了another thread。因此,使用jQuery 3可以完全避免它,使用:在设置和响应中可以使用以下方式:
在这里,您甚至不必再手动创建blob,因为响应已经是一个blob。
Another answer to that thread向您展示了如何通过更改
xhr:
设置将其设置为仅用于成功响应的blob。