C# 字节数组(Web Api 2)到blob(角度客户端)
我想从Web Api下载一个文件,使用Angular作为客户端。我的文件在我的浏览器上下载时不幸被破坏了。我认为这是一个类型差异的错误 Web Api控制器返回“字节[]” 角度服务:C# 字节数组(Web Api 2)到blob(角度客户端),c#,.net,angular,asp.net-web-api,asp.net-web-api2,C#,.net,Angular,Asp.net Web Api,Asp.net Web Api2,我想从Web Api下载一个文件,使用Angular作为客户端。我的文件在我的浏览器上下载时不幸被破坏了。我认为这是一个类型差异的错误 Web Api控制器返回“字节[]” 角度服务: let headers = new Headers({ 'Content-Type': 'application/json' }); let options = new RequestOptions({ headers: headers, responseType: ResponseContent
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers, responseType: ResponseContentType.Blob });
return this.http.post(this.baseUrl + '/MyAction', ac, options)
.map(res => res.blob())
.catch(this.handleError);
角分量
this.service.downloadXls(items).subscribe(
data => this.downloadFile(data)),
error => console.log("Error downloading the file."),
() => console.info("OK");
}
downloadFile(data: Blob) {
let blob = new Blob([data], { type: 'application/vnd.ms-excel' });
let url= window.URL.createObjectURL(blob);
window.open(url);
}
据我所知,我需要接收字节[],并在客户端将其转换为blob。或者在服务器端转换并发送blob。我也不知道怎么做。获取二进制流并不是那么简单,我建议您使用它来完成繁重的工作 我没有角度方面的经验,但这是我不久前在一个项目中使用的代码片段。它是纯JavaScript,但应在Angular上重新使用,只需稍作修改:
<html>
<head>
<script src="FileSaver.min.js"></script>
<script>
function download() {
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://your.url", true);
xhr.setRequestHeader("Content-type","application/json");
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader("Accept", "application/octet-stream");
//xhr.setRequestHeader("Authorization", "Bearer ......");
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var blob = new Blob([xhr.response], {type: "octet/stream"});
var fileName = "my_excel_file.xlsx";
saveAs(blob, fileName);
}
}
xhr.responseType = "arraybuffer";
xhr.send();
}
</script>
</head>
<body>
<button onclick="javascript:download()">Download Excel File</button>
</body>
</html>
函数下载(){
var xhr=new XMLHttpRequest();
xhr.open(“GET”http://your.url“,对);
setRequestHeader(“内容类型”、“应用程序/json”);
setRequestHeader(“访问控制允许来源”,“*”);
setRequestHeader(“接受”、“应用程序/八位字节流”);
//xhr.setRequestHeader(“授权”、“持有人……”);
xhr.onreadystatechange=函数(){
如果(xhr.readyState==4&&xhr.status==200){
var blob=新blob([xhr.response],{type:“octet/stream”});
var fileName=“my\u excel\u file.xlsx”;
saveAs(blob,文件名);
}
}
xhr.responseType=“arraybuffer”;
xhr.send();
}
下载Excel文件
为什么将此标记为重复?要操作:您需要使用此:文件保护程序有问题。我用的方法很好用。问题是,我的文件被破坏了。您只使用“似乎”有效的方法。问题是它没有正确地解码,这就是为什么你会得到一个坏文件。发布另一个问题,详细说明你在使用FileSaver时遇到的问题,我会尽力帮助你。我只是站在Java的立场上说的比其他任何东西都多,但我不完全相信这个问题是重复的。您要发送的MIME类型是什么?