2016-09-11 22 views
1

Pleasssse幫我... 我有一個xlsm文件(excel與宏)在服務器端(c#),並希望下載它在客戶端(javascript,angularjs )。 所以..在服務器端控制器中,我返回一個HttpResponseMessage並在客戶端 - 下載它。在客戶端dowclock時xlsm文件被破壞

的問題是,打開已下載該文件時,它已損壞...

我做了一個簡短的測試案例來說明問題。


服務器端(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();       
    })  
} 
+0

檢查字節數,使字節的數量肯定沒有改變。您的流可能使用了破壞文件的默認ASCII編碼。您需要使用不會更改文件的UTF8編碼。我會使用以下內容:StreamReader stream = new StreamReader(@「D:\ excel \ data.xlsm」,Encoding.UTF8); – jdweng

+0

爲什麼在文件內容前加上BOM('\ uFEFF')?這可能是導致你的問題。 –

+0

此外,爲什麼不把代碼放到'href'屬性中,然後調用'.click()'。嘗試下載文件,然後將其作爲數據URI從鏈接提供,這無疑會使問題複雜化。 –

回答

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();       
} 
+0

再次感謝。我的URL需要接收一個複雜的參數(對象數組),我該如何在URL中做到這一點? – mor

+0

@mor數組通常在查詢字符串中傳遞,如下所示:'?Values [] = 1&Values [ ] = 2&Values [] = 3'這樣的數組:'Values = [1,2,3]'。如果你需要比這更復雜的東西,你有兩個簡單的選擇:1)創建一個JSON字符串並將其傳遞給查詢字符串。 2)創建一個'form'元素,其中包含一些'input'元素而不是'a'元素,並且使用'form.submit()'而不是'link.click()'。如果你需要更多的幫助,你應該問另一個問題。 –

+0

謝謝,我會盡力做到這一點。 – mor