C#返回本地XML文件至AngularJS下载出现[object Object]问题求解
问题原因
- 核心原因是AngularJS默认的响应转换逻辑:你后端返回的
Content-Type为text/xml,AngularJS会自动将响应内容解析为XML Document对象,即便你配置了responseType: 'arraybuffer',默认的响应转换器仍然会覆盖配置的返回类型,最终你拿到的result.data是XML对象而非二进制流。 - 将XML对象传入
Blob构造函数时,Blob会自动调用对象的toString()方法,序列化结果就是你看到的[object Object]。 - 额外的写法问题:你使用的
success/error是AngularJS废弃的回调语法,且该回调的返回值不会传递到外层的then,也可能导致数据传递异常。
解决方法
前端修改(核心修复)
1. 调整服务层请求代码
禁用AngularJS默认的响应转换器,保留二进制返回类型,同时废弃过时的success/error写法:
public downloadActiveTrend() { var urlPath = this.urlHelper.getPath(App.UrlHelper.Path.DownloadExportTrend); console.log(urlPath); // 直接返回$http的promise,不需要额外包一层 return this.$http({ method: 'POST', url: urlPath, responseType: 'arraybuffer', transformResponse: [] // 加这行禁用默认响应转换,防止xml被解析为DOM对象 }).catch(function (response) { console.log("Request failed with status: " + response.status); throw response; }); }
2. 可选优化:直接返回Blob类型
如果觉得arraybuffer处理麻烦,也可以直接将responseType改成blob,后续不需要额外转Blob,还可以补充内存释放逻辑避免泄漏:
public downloadActiveTrend() { var urlPath = this.urlHelper.getPath(App.UrlHelper.Path.DownloadExportTrend); return this.$http({ method: 'POST', url: urlPath, responseType: 'blob', transformResponse: [] }).catch(response => { console.log("Request failed with status: " + response.status); throw response; }); } // 对应调用层代码可以简化为: public openExportTrendDialog(): void { this.trendService.downloadActiveTrend().then(function (result) { var fileURL = window.URL.createObjectURL(result.data); var fileName = "trend.xml"; var a = document.createElement("a"); document.body.appendChild(a); a.href = fileURL; a.download = fileName; a.click(); // 用完释放url,避免内存泄漏 window.URL.revokeObjectURL(fileURL); document.body.removeChild(a); }) };
后端可选优化
调整返回的文件名补全后缀,更符合下载规范:
response.Content.Headers.ContentDisposition.FileName = "trend.xml";
内容的提问来源于stack exchange,提问作者Ronan Duffy
相关产品推荐
相关产品推荐

