Reputation: 946
I'm new to ASP.NET MVC and I'm trying to figure out how to zip and download files stored in a database.
Do I need to zip the files, save them in memory or server, and then send that file to the user. I would rather not save it on the server.
Model:
public class Document
{
public int Id { get; set; }
public string Name { get; set; }
public string ContentType { get; set; }
public byte[] Content { get; set; }
}
Controller:
[HttpPost]
[Route("~/document/zip/{token}")]
public ActionResult DownloadZip(string token)
{
// EF6
var docs = db.Documents.ToList();
using (var memoryStream = new MemoryStream())
{
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach (var doc in docs)
{
var file = archive.CreateEntry(doc.Name.ToString());
using (var streamWriter = new StreamWriter(file.Open()))
{
streamWriter.Write(doc.Name.ToString());
}
}
}
return File(memoryStream.ToArray(), "~/WebApplication/Documents", "xxxx.zip");
};
}
Upvotes: 0
Views: 2994
Reputation: 68
If you want put your content to file, you have to take stream from file.Open()
and write byte array to this stream
[HttpPost]
[Route("~/document/zip/{token}")]
public ActionResult DownloadZip(string token)
{
// EF6
var docs = db.Documents.ToList();
using (var memoryStream = new MemoryStream())
{
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach (var doc in docs)
{
var file = archive.CreateEntry(doc.Name.ToString());
using (var stream = file.Open())
{
stream.Write(doc.Content, 0, doc.Content.Length);
}
}
}
return File(memoryStream.ToArray(), "application/zip", "xxxx.zip");
};
}
Upvotes: 1