2017-04-18 17 views
0

我從這裏通過該守則C#塊流爲http repsonse

https://forums.asp.net/t/1556522.aspx?RDLC+Export+directly+to+Excel+or+PDF+from+codebehind 

我建我的字節數組

byte[] bytes = viewer.LocalReport.Render("PDF", null, out mimeType, 
            out encoding, 
            out extension, out streamIds, out warnings); 

Response.Buffer = true; 
Response.Clear(); 
Response.ContentType = mimeType; 
Response.AddHeader("content-disposition", "attachment; filename=" + fileName + "." + extension); 
Response.BinaryWrite(bytes); // create the file 
Response.Flush(); // send it to the client to download 

但是我擔心的字節被周圍的4Gb巨大並把它寫進http響應需要以塊的形式進行流式傳輸。

我在.net版本4.6任何想法如何我可以寫入響應對象的塊大小的流? 當Response.BinaryWrite(字節)將死亡如果字節是巨大的,我打算取代它,但想知道如何?

我的研究把我帶到 https://msdn.microsoft.com/en-us/library/ms252172.aspx

凡渲染方法可以使流對象

public void Render(
    string format, 
    string deviceInfo, 
    CreateStreamCallback createStream, 
    out Warning[] warnings 
) 

如何塊從流回調到一個HTTP響應的數據對象的任何線索?

+0

PDF超過4GB將成爲任何人查看它的真正問題;) 您將需要遍歷文件讀取塊,並在每個塊做BinaryWrite。 – Charlie

回答

0

返回FileResult並定義octet-stream的MIME類型:

public FileResult Download() 
{ 
    byte[] fileBytes = System.IO.File.ReadAllBytes(@"c:\folder\myfile.ext"); 
    string fileName = "myfile.ext"; 
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); 
} 

它將流和瀏覽器會找出基於文件名的文件類型。

+0

這可能會與原始代碼具有相同的負面影響:它將阻止連接並且無法恢復。 – Charlie

+0

我可能誤解了,但他沒有說很長時間,他只是想要一種大塊的方式。這是什麼代碼將做什麼。但是如果他擔心時間太長,超時而又無法恢復,那麼他需要的東西遠比單一流更爲重要。 –

+0

原始提案可能還有另一個大問題,如果文件超過4GB,字節數組可能會溢出。 – Charlie