如何通过http正确发送二进制文件并使用javascript下载?
我遇到的这个问题可能是我工作流程中的任何问题,但我现在将从这个范围开始 我有一个RESTAPI,你可以发送一个JSON结构,它会发回一个excel文件,但我无法让它在浏览器/Javascript中工作 我在浏览器中的Javascript代码基本上如下所示:如何通过http正确发送二进制文件并使用javascript下载?,javascript,python-3.x,amazon-web-services,http,encoding,Javascript,Python 3.x,Amazon Web Services,Http,Encoding,我遇到的这个问题可能是我工作流程中的任何问题,但我现在将从这个范围开始 我有一个RESTAPI,你可以发送一个JSON结构,它会发回一个excel文件,但我无法让它在浏览器/Javascript中工作 我在浏览器中的Javascript代码基本上如下所示: fetch('myapiurl') .then(response => response.blob) .then(blob => downloadBlob(blob)) function down
fetch('myapiurl')
.then(response => response.blob)
.then(blob => downloadBlob(blob))
function downloadBlob(blob){
const a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = 'export.xlsx;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
但这会生成一个已损坏的文件,要么缺少某些内容,要么发送的文件编码不正确
下面是API发送文件部分的python代码(它是AWS lambda):
output=BytesIO()
#将excel文件放入输出的代码
返回{
“状态代码”:200,
“标题”:{
“内容处置”:“附件;文件名=“export.xlsx”,
“内容类型”:“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”,
“访问控制允许来源”:“*”
},
#我无法返回原始字节,因此我将其转换为字符串
“body”:output.getvalue().hex(),
}
我把文件寄错了吗
我尝试将其作为base64发送,但它仍然被损坏
如果我使用python在本地进行测试,只需bytes.fromhex()
api响应,并以字节模式将其写入文件中,它就可以工作
我想知道AWS Api Gateway是否会自动将我的身体编码为base64。进行此更改后,它可能会工作
-.then(response=>response.blob)
+。然后(response=>response.blob())
关于回应机构
#I can't return raw bytes so I transform it into a string
'body' : output.getvalue().hex(),
您不能发回十六进制字符串,您需要发送原始数据。否则,在生成blob和objectURL之前,必须在客户端将十六进制转换回二进制
您可能已经知道,如果使用ajax获取附件,浏览器将不会保存附件,您需要做的是“导航”到该文件以触发下载。由于您要发布json数据并将其转换为excel,您必须执行表单提交以将数据发送到服务器,而不是使用ajax,因为这不是常规的GET请求
<form hidden method="post" enctype="text/plain" action="url">
<textarea name="json">{"a":12}</textarea>
<input type="submit">
</form>
{“a”:12}
这会更好,因为在保存文件之前,您不必保存浏览器内存中的所有数据,此外,您可以更早地开始保存文件