尝试使用Ionic.Zip dll将多个文件作为Zip文件下载时出现OutOfMemory异常

时间:2015-05-17 09:08:05

标签: c# asp.net-mvc memorystream

这是我用来使用Ionic.Zip dll将多个文件作为zip文件下载的工作代码。文件内容存储在SQL数据库中。如果我尝试一次下载1-2个文件,该程序可以正常工作,但如果我尝试下载多个文件,则会抛出OutOfMemory异常,因为某些文件可能非常大。

当它尝试写入outputStream时会发生异常。

如何改进此代码以下载多个文件,或者是否有更好的方法逐个下载多个文件而不是将它们压缩到一个大文件中?

代码:

public ActionResult DownloadMultipleFiles()
{
    string connectionString = "MY DB CONNECTIOBN STRING";

    List<Document> documents = new List<Document>();
    var query = "MY LIST OF FILES - FILE METADA DATA LIKE FILEID, FILENAME";
    documents = query.Query<Document>(connectionString1).ToList();

    List<Document> DOCS = documents.GetRange(0, 50); // 50 FILES

    Response.Clear();     
    var outputStream = new MemoryStream();

    using (var zip = new ZipFile())
    {
        foreach (var doc in DOCS)
        {
            Stream stream = new MemoryStream();
            byte[] content = GetFileContent(doc.FileContentId); // This method returns file content
            stream.Write(content, 0, content.Length);

            zip.UseZip64WhenSaving = Zip64Option.AsNecessary // edited

            zip.AddEntry(doc.FileName, content);
        }

        zip.Save(outputStream);
    }

    return File(outputStream, "application/zip", "allFiles.zip");
}

1 个答案:

答案 0 :(得分:1)

将文件下载到光盘而不是内存,然后使用Ionic从光盘中压缩它们。这意味着您不需要一次将所有文件都存储在内存中。