1

请帮帮我...我在服务器端(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();                        
    })       
}
4

1 回答 1

0

问题可能是您使用 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();                        
}
于 2016-09-12T15:03:27.563 回答