我正在编写一个通用处理程序,用于从安全的FTP服务器下载相当大(400+ MB)的文件。通过将响应流复制到MemoryStream,然后二进制写入字节数组,我已经让我的代码在小型测试图像上运行成功。
我的代码如下(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内存的活动Web服务器上(由于这是一个相当大的网站,它目前使用其现有内存的约60%!它可能需要升级内存 ;-)),使用CopyTo()和MemoryStream处理如此大的文件是否安全?
我知道我可以通过ftp://username:password@path.com直接将下载链接设置到客户端上,但FTP上的内容受到密码保护,因为其中包含一些敏感数据。
因此,是否使用MemoryStream处理如此大的文件是安全的?如果不是:是否有其他我忽略的方法来处理此问题?
提前感谢 :-)