2014-03-25 18 views
1

我正在將Crystal報表導出到pdf文檔,UI中有一個按鈕用於在「Downloads」文件夾下載該pdf。爲了達到這個目的,我在web api中有一個方法,通過單擊按鈕執行,並且該方法返回內容爲字節數組的HttpResponseMessage(pdf位於blob上,並將該文件下載到字節數組中)。 從UI,使用javascript的window.open方法我直接打開web api方法的URL,當執行的時候在下載文件夾中下載文件。在web客戶端下載pdf格式的字節數組作爲pdf在客戶端

這工作正常。但是現在我已經向web api控制器添加了[Authorize]屬性,因此當javascript窗口打開時,會提示用戶輸入用戶名和密碼值。

我想發佈一個ajax請求到服務器,它返回客戶端上的字節數組。執行Ajax請求後,我寫了下面的代碼:

data = "data:application/octet-stream;base64," + data; 
document.location = data; 

該文件確會下載,但它會下載爲我必須使用「下載」文件「打開方式...」選項查看文件。我如何將它作爲pdf文檔下載?

回答

0

如果你試圖服務與的WebAPI一個文件,你可以這樣做:

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK); 
Stream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true); 
response.Content = new StreamContent(fileStream); 
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
response.Content.Headers.ContentDisposition.FileName = "myfilename.pdf"; 

    return response; 

你並不需要手動配置流,該框架調用HttpResponseMessage.Dispose,這就要求StreamContent.Dispose ,它調用FileStream.Dispose。

+0

我以前寫過類似的代碼,它工作得很好。但我現在用[Authorize]屬性裝飾了我的web api控制器。這就是爲什麼我從服務器發送byte []到客戶端。您可以再次閱讀該問題。我想在客戶端上以pdf格式下載該字節[]。 – user2585299