我需要傳輸大型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,但第二個參數是要將文件轉儲到的流。
任何幫助,或更好的方式來做到這一點會很好。
這是什麼'SftpClient'? – spender
downloadfile返回什麼?.... ienumerable?...對象? – terrybozzio
我已經更新了主帖以回答這些問題 – referscus