【发布时间】:2016-09-11 11:25:43
【问题描述】:
请帮帮我... 我在服务器端(c#)有一个 xlsm 文件(带有宏的 excel),并想在客户端(javascript、angularjs)下载它。 所以..在服务器端控制器中我返回一个 HttpResponseMessage 并在客户端 - 下载它。
问题是打开下载的文件时,已经损坏了……
我做了一个简短的测试用例来演示这个问题。
服务器端(c# ApiController):
[HttpGet]
public HttpResponseMessage exportDPs()
{
var response = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
var stream = new FileStream(@"D:\excel\data.xlsm", FileMode.Open);
response.Content = new StreamContent(stream);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = "DPs.xlsm";
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentLength = stream.Length;
response.StatusCode = System.Net.HttpStatusCode.OK;
return response;
}
客户端(javascript、angularjs):
$scope.exportDPs = function () {
$http({
method: GET,
url: '../Api/DPs/exportDPs',
}).success(function (data) {
var file = data;
var encodedUri = encodeURI(file);
var link = document.createElement("a");
link.setAttribute("href", "data:application/vnd.ms-excel.sheet.macroEnabled.12;charset=utf-8,\uFEFF" + encodedUri);
link.setAttribute("download", "DPs");
link.click();
})
}
【问题讨论】:
-
检查字节数以确保字节数没有改变。您的流可能正在使用损坏文件的默认 ASCII 编码。您需要使用不会更改文件的 UTF8 编码。我会使用以下内容: StreamReader stream = new StreamReader(@"D:\excel\data.xlsm", Encoding.UTF8);
-
为什么要在文件内容前加上 BOM (
\uFEFF)?这很可能是导致您的问题的原因。 -
另外,为什么不把下载链接放到
href属性中,然后调用.click()。尝试下载文件,然后从链接中将其作为数据 URI 提供,这会使您的问题变得不必要地复杂化。 -
感谢您的回复和帮助!
-
Moshe Katz,当我提供文件的 URL 时,我收到错误消息 - 不允许加载本地资源。 jdweng,客户端的文件大小是OK的,也就是说服务器端没有损坏文件,只是下载的时候,文件变大了,文件损坏了……
标签: c# asp.net download data-uri xlsm