2014-07-02 54 views
1

我需要傳輸大型PDF(300 MB - 1GB)。現在我從sftp服務器將它們下載到MemoryStream,然後將它們流式傳輸到瀏覽器。它適用於小型Pdfs,但是大於400MB的任何內容都會在瀏覽器中打開PDF查看器,進度條緩慢移動到100%,但pdf不會加載。如果我獲得大於500MB的空間,我會在下載時遇到SystemOutOfMemory例外。這裏是我的相關代碼使用.net和sftp服務器流式傳輸大型PDF

MemoryStream memStream = new MemoryStream(); 

using (var client = new SftpClient(sftpHost, port, username, password)) 
{ 
    try 
    { 
     client.Connect(); 
     client.ChangeDirectory(envDirectory); 
     using (memStream) 
     { 
      client.DownloadFile(fileName + extension, memStream); 

      httpResponse.Clear(); 
      httpResponse.ClearContent(); 
      httpResponse.ClearHeaders(); 
      httpResponse.Buffer = true; 
      httpResponse.ContentType = "application/pdf"; 
      httpResponse.AddHeader("Content-Length", memStream.Length.ToString()); 

      memStream.WriteTo(httpResponse.OutputStream); 
      httpResponse.Flush(); 
     } 
    } 
} 

--- UPDATE ---

我把花錢的建議,改變了我的代碼

 using (var client = new SftpClient(sftpHost, port, username, password)) 
     { 
      try 
      { 
       client.Connect(); 
       client.ChangeDirectory(envDirectory); 
       httpResponse.Clear(); 
       httpResponse.ClearContent(); 
       httpResponse.ClearHeaders(); 
       httpResponse.Buffer = true; 
       httpResponse.ContentType = "application/pdf"; 
       client.DownloadFile(fileName + extension, httpResponse.OutputStream); 
      } 

這擺脫了內存溢出異常的,但較大的PDF仍然開始加載,然後停下來只是一個空白的屏幕,較小的PDF仍然很好。

SftpClient從https://sshnet.codeplex.com/ client.DownloadFile(fileName + extension,httpResponse.OutputStream);返回void,但第二個參數是要將文件轉儲到的流。

任何幫助,或更好的方式來做到這一點會很好。

+0

這是什麼'SftpClient'? – spender

+0

downloadfile返回什麼?.... ienumerable?...對象? – terrybozzio

+0

我已經更新了主帖以回答這些問題 – referscus

回答

1

所以,SftpClient也不是那麼我猜了一下BCL的一部分,但你已經添加了所有的頭你的迴應後,你能不能只:

client.DownloadFile(fileName + extension, httpResponse.OutputStream); 

跳過共MemoryStream

+0

跳過MemoryStream擺脫了內存不足的異常,但我仍然遇到了問題,它不會加載較大的pdf。它開始加載,然後一段時間後加載欄消失,我留下一個空白屏幕。 – referscus

相關問題