使用内存流下载大文件

波莫滕森

我正在编写一个通用处理程序,该处理程序用于从受保护的FTP服务器下载相当大的文件(超过400 MB)。通过将响应流复制到MemoryStream,然后以二进制方式写入bytes数组,我的代码可以处理小型测试图像。

我的代码如下所示(DownloadFile.ashx):

// Set correct path
string path = ftpHelper.GetCompletePath();
path += "/" + loginId + "/" + folderName + "/" + fileName;

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(path);
request.UsePassive = false;
request.Credentials = new NetworkCredential(ftpHelper.Username, ftpHelper.Password);

byte[] fileBytes = null;

using (var response = (FtpWebResponse)request.GetResponse())
{
    using (Stream responseStream = response.GetResponseStream())
    {
        using (var memoryStream = new MemoryStream())
        {
            if (responseStream != null) responseStream.CopyTo(memoryStream);
            fileBytes = memoryStream.ToArray();
        }
    }
 }

if (fileBytes.Length > 0)
{
     context.Response.AppendHeader("Content-Length", fileBytes.Length.ToString());
     context.Response.BinaryWrite(fileBytes);
}

request.Abort();

context.ApplicationInstance.CompleteRequest();

问题是:在具有8gb ram的实时网络服务器上(由于它是一个很大的网站,它目前正在使用它的现有ram的60%左右!它可能需要ram升级;-))将CopyTo()和使用带有如此大文件的MemoryStream?

我知道我可以通过ftp:// username:[email protected]将客户端上的下载链接直接设置为FTP服务器,但是FTP上的内容受密码保护是有原因的,因为上面有一些敏感数据。

那么,内存流可以安全地用于如此大的文件吗?如果没有:还有其他方法我忽略了吗?

提前致谢 :-)

异种闪电

MemoryStream用于大型文件是“安全的”。但是,您会将整个文件加载到内存中,直到Garbage Collection确定是回收该内存的好时机为止,它将一直保留在内存中。

8GB RAM对于“中型”负载生产服务器来说足够了。当然,这是客观的,但是如果单个中流量WebApp使用的内存超过8GB,则应修改一些设计决策。

有两个选项可避免将整个远程文件加载到内存中:

  1. 将其写入磁盘上的本地文件,然后将该文件提供回WebApp客户端
  2. 直接对响应流进行分块写入

选项2可能类似于:

//...
using (Stream responseStream = response.GetResponseStream())
{
    Response.BufferOutput= false;   // to prevent buffering 
    byte[] buffer = new byte[1024]; 
    int bytesRead = 0; 
    while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)  
    { 
         Response.OutputStream.Write(buffer, 0, bytesRead); 
    }
}
//...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python:在内存中生成xlsx并流下载文件?

来自分类Dev

使用PowerShell下载大文件

来自分类Dev

PDFSharp通过文件流下载文件

来自分类Dev

使用大字节数组下载大文件会导致“内存不足”

来自分类Dev

在Sinatra和Thin上下载大文件占用大量内存

来自分类Dev

在 PHP 中读取/下载大文件而不会耗尽内存

来自分类Dev

使用HttpClient下载Web API大文件

来自分类Dev

如何使用wget下载大文件?

来自分类Dev

使用HttpClient下载Web API大文件

来自分类Dev

使用ftp协议下载大文件

来自分类Dev

如何使用Java REST服务和数据流下载文件

来自分类Dev

下载大文件

来自分类Dev

大文件下载cherrypy

来自分类Dev

下载大文件

来自分类Dev

大文件下载cherrypy

来自分类Dev

从HDFS下载大文件

来自分类Dev

express.js:如何将流下载为文件?

来自分类Dev

提示将多个文件流下载为一个

来自分类Dev

如何使用FSharp.Data的http模块下载大文件?

来自分类Dev

使用python请求中断流式下载大文件

来自分类Dev

使用WebClient在Unity3d中下载大文件

来自分类Dev

使用多个并行线程分批下载大文件

来自分类Dev

如何使用Node.js从Dropbox下载大文件?

来自分类Dev

如何使用Angular的httpClient下载大文件(> 1GB)?

来自分类Dev

使用SharpZipLib压缩大文件导致内存不足异常

来自分类Dev

attoparsec高内存使用率读取大文件

来自分类Dev

分析大文件中的数据时如何使用最小内存

来自分类Dev

Google Drive API V3内存不足,无法下载大文件

来自分类Dev

php下载大文件失败