2013-03-13 4 views
1

У меня есть мнение, где я поставил идентификатор события, то я могу загрузить все изображения для этого события ..... вот мой кодASP MVC Скачать Zip Files

[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» любые идеи ???

+0

отладки, чтобы проверить, если '' downloadFileName' содержит .zip' расширение .. –

+0

Она содержит .zip вот что в нем «YourDownload-2013-03-13-15_04_20.zip» –

ответ

9

В 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.

+0

я только работал, когда я заменил " application/zip "с" application/octet-stream "даже в моем коде. также zipFile.GetBytes() дает ошибку –

+0

У меня есть еще одна проблема: нет .zip-файл содержит весь путь к файлу, который я хочу, чтобы изображения были в zip-файле? как я могу это сделать ?? –

+0

Измените свой ответ, как я сказал вам, и я отметю его –

Смежные вопросы