我有ASP.NET Web API项目,用户可以从数据库中下载一些东西。 我的下载控制器从数据库实例中获取数据。每个结果都有一个blob字段,它是某种数据(1)。 我想将每个结果添加到ZIP文件(2)。毕竟我发送HTTP响应添加我的流内容。
List<Result> results = m_Repository.GetResultsForResultId(given_id_by_request);
// 1
foreach (Result result in results)
{
string fileName = String.Format("{0}-{1}.bin", id >> 16, result.Id);
zipFile.AddEntry(fileName, result.Value);
}
// 2
PushStreamContent pushStreamContent = new PushStreamContent((stream, content, context) =>
{
zipFile.Save(stream);
stream.Close();
}
response = new HttpResponseMessage(HttpStatusCode.OK) { Content = pushStreamContent };
效果很好!但是在大量下载请求中,这耗尽了我的记忆。我需要找到一种方法将流放入zip缓冲区。有人可以帮帮我吗?!
答案 0 :(得分:1)
从我发布的代码中我可以看到,您没有处理使用后创建的流。这可能会增加您的应用程序保留的大量内存,这可能会导致您的问题。
我正在使用ZipArchive将多个文件放入我的网络应用程序中的zip文件中。代码看起来有点像:
using (var compressedFileStream = new MemoryStream())
{
using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Update, false))
{
foreach (Result result in results)
{
string fileName = String.Format("{0}-{1}.bin", id >> 16, result.Id);
var zipEntry = zipArchive.CreateEntry(fileName);
using (var originalFileStream = new MemoryStream(result.Value))
{
using (var zipEntryStream = zipEntry.Open())
{
originalFileStream.CopyTo(zipEntryStream);
}
}
}
}
return File(compressedFileStream.ToArray(), "application/zip", string.Format("Download_{0:ddMMyyy_hhmm}.zip", DateTime.Now));
}
我在MVC Controller方法中使用该代码段,因此您必须根据您的情况调整返回部分。
以上代码在我的应用程序中可以正常工作,最多300个条目或50MB卷(这些是我的应用程序要求设置的限制)。
希望对你有所帮助。
编辑:忘记第一个使用块的结束括号。