ASP MVC Скачать Zip файлы
У меня есть вид, где я помещаю идентификатор события, то я могу загрузить все изображения для этого события..... вот мой код
[HttpPost]
public ActionResult Index(FormCollection All)
{
try
{
var context = new MyEntities();
var Im = (from p in context.Event_Photos
where p.Event_Id == 1332
select p.Event_Photo);
Response.Clear();
var downloadFileName = string.Format("YourDownload-{0}.zip", DateTime.Now.ToString("yyyy-MM-dd-HH_mm_ss"));
Response.ContentType = "application/zip";
Response.AddHeader("content-disposition", "filename=" + downloadFileName);
using (ZipFile zipFile = new ZipFile())
{
zipFile.AddDirectoryByName("Files");
foreach (var userPicture in Im)
{
zipFile.AddFile(Server.MapPath(@"\") + userPicture.Remove(0, 1), "Files");
}
zipFile.Save(Response.OutputStream);
//Response.Close();
}
return View();
}
catch (Exception ex)
{
return View();
}
}
Проблема в том, что каждый раз, когда я получаю HTML-страницу для загрузки, поэтому вместо загрузки "Album.zip" я получаю "Album.html" какие-либо идеи???
1 ответ
В MVC вместо возврата представления, если вы хотите вернуть файл, вы можете вернуть это как ActionResult
при выполнении:
return File(zipFile.GetBytes(), "application/zip", downloadFileName);
// OR
return File(zipFile.GetStream(), "application/zip", downloadFileName);
Не связывайтесь с ручной записью в выходной поток, если вы используете MVC.
Я не уверен, что вы можете получить байты или поток из ZipFile
класс хотя. В качестве альтернативы, вы можете захотеть записать вывод на MemoryStream
а затем вернуть это:
var cd = new System.Net.Mime.ContentDisposition {
FileName = downloadFileName,
Inline = false,
};
Response.AppendHeader("Content-Disposition", cd.ToString());
var memStream = new MemoryStream();
zipFile.Save(memStream);
memStream.Position = 0; // Else it will try to read starting at the end
return File(memStream, "application/zip");
И с помощью этого вы можете удалить все строки, в которых вы делаете что-либо с Response
, Не нужно Clear
или же AddHeader
,