C# 字节数组(Web Api 2)到blob(角度客户端)

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

我想从Web Api下载一个文件,使用Angular作为客户端。我的文件在我的浏览器上下载时不幸被破坏了。我认为这是一个类型差异的错误

Web Api控制器返回“字节[]”

角度服务:

    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类型是什么?