在客户端下载时 xlsm 文件已损坏
an xlsm file is corrupted when dowloaded at client side
请帮帮我...
我在服务器端 (c#) 有一个 xlsm 文件(excel with macro),想在客户端下载它(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();
})
}
问题可能是您在服务器内容前加上了 Unicode 字节顺序标记 (BOM) - \uFEFF
。 BOM 仅对文本文件有用,但 XLSM 是二进制文件(更具体地说,它是 XML 个文件的 ZIP 文件)。
然而,与其担心这个,最好的办法是简化你的 JavaScript 这样你就可以直接下载文件而不是尝试在后台下载文件并制作数据 URI出来了。
这应该可以满足您的要求:
$scope.exportDPs = function () {
var link = document.createElement("a");
link.setAttribute("href", "../Api/DPs/exportDPs");
link.setAttribute("download", "DPs");
link.click();
}
请帮帮我... 我在服务器端 (c#) 有一个 xlsm 文件(excel with macro),想在客户端下载它(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();
})
}
问题可能是您在服务器内容前加上了 Unicode 字节顺序标记 (BOM) - \uFEFF
。 BOM 仅对文本文件有用,但 XLSM 是二进制文件(更具体地说,它是 XML 个文件的 ZIP 文件)。
然而,与其担心这个,最好的办法是简化你的 JavaScript 这样你就可以直接下载文件而不是尝试在后台下载文件并制作数据 URI出来了。
这应该可以满足您的要求:
$scope.exportDPs = function () {
var link = document.createElement("a");
link.setAttribute("href", "../Api/DPs/exportDPs");
link.setAttribute("download", "DPs");
link.click();
}