Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过http正确发送二进制文件并使用javascript下载?_Javascript_Python 3.x_Amazon Web Services_Http_Encoding - Fatal编程技术网

如何通过http正确发送二进制文件并使用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

我遇到的这个问题可能是我工作流程中的任何问题,但我现在将从这个范围开始

我有一个RESTAPI,你可以发送一个JSON结构,它会发回一个excel文件,但我无法让它在浏览器/Javascript中工作

我在浏览器中的Javascript代码基本上如下所示:

    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}
这会更好,因为在保存文件之前,您不必保存浏览器内存中的所有数据,此外,您可以更早地开始保存文件