Javascript 获取API下载文件

Javascript 获取API下载文件,javascript,c#,fetch-api,Javascript,C#,Fetch Api,我觉得我离做对这件事已经很近了。 在本例中,文件大小为125 KB,类型为image/png 我有一个C#controller方法,它用一个文件构造一个HttpResponseMessage,如下所示: 公共异步任务Get(int-id) { var file=await_api.GetFileAsync(id); var httpResult=新的HttpResponseMessage(HttpStatusCode.OK); httpResult.Content=newbyteArrayCon

我觉得我离做对这件事已经很近了。
在本例中,文件大小为125 KB,类型为image/png

我有一个C#controller方法,它用一个文件构造一个HttpResponseMessage,如下所示:

公共异步任务Get(int-id)
{
var file=await_api.GetFileAsync(id);
var httpResult=新的HttpResponseMessage(HttpStatusCode.OK);
httpResult.Content=newbyteArrayContent(file.Bytes);
httpResult.Content.Headers.ContentType=新的MediaTypeHeaderValue(file.ContentType);
httpResult.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=file.Name
};//附件将强制下载
返回httpResult;
}
原始文件本身保存在
file.Bytes的字节[]中

下面是一个调用它的JavaScript函数:

get(文件ID,文件名){
返回此.httpFetch.fetch(`${this.apiRoot}/v1/files/${fileId}`)
.then(response=>response.blob())
。然后(数据=>{
if(window.navigator.msSaveOrOpenBlob)
window.navigator.msSaveBlob(数据);
否则{
var link=document.createElement(“a”);
link.href=window.URL.createObjectURL(数据);
link.download=文件名;
document.body.appendChild(link);//FF需要
link.click();
}
});
}
下面是Chrome网络工具的有效载荷预览。我觉得有点空虚。。。

类型和文件名都是正确的,它可以自动下载,但我最终得到的文件是336字节,无法读取

我错过了什么


更多信息:
httpFetch
是Aurelia(Aurelia fetch client)提供的
fetch
的包装器。我正在使用Aurelia作为我的前端框架。

我无法解释上面的解决方案为什么不起作用,但其他一些测试表明,问题更可能出现在后端C#WebApi控制器方法中,因为我的有效负载可能会丢失。。。好。。。奇怪的文件

我选择了一个更简单的解决方案,即:

公共异步任务Get(int-id)
{
var file=await_api.GetFileAsync(id);
var obj=新
{
文件名,
file.ContentType,
Base64String=Convert.ToBase64String(file.Bytes)
};
返回新的OkObjectResult(obj);
}
请注意,我是如何返回一个匿名对象,其中包含文件的名称、内容类型和base64字符串表示形式。将其与上的解决方案相结合,只需对
get
JavaScript函数稍作修改即可很好地解决问题:

let blob=this.base64toBlob(data.base64String,data.contentType);
var link=document.createElement(“a”);
link.href=window.URL.createObjectURL(blob);
link.download=文件名;
document.body.appendChild(链接);//FF所需
link.click();
解决(blob);

这个.httpFetch.fetch是什么?它只是一个
fetch
的包装吗?@evolutionxbox是正确的。这是一个
aurelia fetch client
msSaveBlob
的包装,是一个你确定要使用它吗?@evolutionxbox谢谢你的建议。考虑到上述方法不起作用,我完全支持一个更好的解决方案。可以帮忙吗?