Devolver varios archivos de la acción MVC

Resuelto Giovanni B asked hace 12 años • 4 respuestas

Tengo una aplicación MVC 3 que tiene un par de lugares donde se genera y devuelve un archivo de texto en una acción usando:

return File(System.Text.Encoding.UTF8.GetBytes(someString),
                 "text/plain", "Filename.extension");

y esto funciona fabulosamente. Ahora tengo una situación en la que intento devolver un par de archivos de manera similar. En la vista, tengo un enlace de acción como "Haga clic aquí para obtener esos 2 archivos" y me gustaría que ambos archivos se descarguen de manera similar a como se descarga el archivo único en el fragmento de código anterior.

¿Cómo puedo conseguir esto? He estado buscando bastante y ni siquiera he visto esta pregunta planteada en ninguna parte...

Giovanni B avatar Oct 04 '12 00:10 Giovanni B
Aceptado

Aprovechando la idea de Yogendra Singh y utilizando DotNetZip :

var outputStream = new MemoryStream();

using (var zip = new ZipFile())
{
    zip.AddEntry("file1.txt", "content1");
    zip.AddEntry("file2.txt", "content2");
    zip.Save(outputStream);
}

outputStream.Position = 0;
return File(outputStream, "application/zip", "filename.zip");

Actualización 10/04/2019: Como señaló @Alex, el comprimir se admite de forma nativa desde .NET Framework 4.5, de JitBit y otros:

using (var memoryStream = new MemoryStream())
{
   using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
   {
      var file1 = archive.CreateEntry("file1.txt");
      using (var streamWriter = new StreamWriter(file1.Open()))
      {
         streamWriter.Write("content1");
      }

      var file2 = archive.CreateEntry("file2.txt");
      using (var streamWriter = new StreamWriter(file2.Open()))
      {
         streamWriter.Write("content2");
      }
   }

   return File(memoryStream.ToArray(), "application/zip", "Images.zip")
}
tocallaghan avatar Feb 21 '2013 02:02 tocallaghan

Perdón por abordar una vieja pregunta pero...

Otra alternativa sería iniciar múltiples descargas de archivos usando JavaScript y entregar archivos en dos métodos de acción diferentes en el lado de ASP.NET.

Estás diciendo que tienes un enlace:

En la vista, tengo un enlace de acción como "Haga clic aquí para obtener esos 2 archivos".

Así que haz este enlace así:

<a href="#" onclick="downloadFile(url1); downloadFile(url2);">Click to get 2 files</a>
<script src="download.js"></script>

Estoy usando download.jsel script que se encuentra aquí , pero puedes encontrar muchas otras opciones diferentes; consulta esta pregunta SO: iniciar la descarga del archivo con JavaScript, por ejemplo

jazzcat avatar Nov 23 '2016 00:11 jazzcat

Recomendaría crear un ziparchivo que incluya ambos archivos siguiendo los pasos (ALGORITMO):

  1. Cree un archivo Zip y agregue los archivos deseados en el zip
  2. Devuelve el archivo zip que contiene todos los archivos deseados de la acción.

Sintaxis de Java (solo para entender)

      FileOutputStream fos = new FileOutputStream("downloadFile.zip");
      ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos));
      zos.putNextEntry(new ZipEntry("Filename1.extension"+));
      //write data in FileName1.extension
      zos.write(contentBuffer1, 0, len);

      zos.putNextEntry(new ZipEntry("Filename2.extension"));
      //write data in FileName2.extension
      zos.write(contentBuffer2, 0, len);

      //write other files.....
      zos.close();

Una vez zipcreado el archivo, devuelva el ziparchivo recién creado para descargarlo.

     return File("downloadFile.zip");

.DOT Net Equivalente usando DotNetZip

     var os = new MemoryStream();

     using (var zip = new ZipFile())
     {
         //write the first file into the zip
         zip.AddEntry("file1.txt", "content1");

         //write the second file into the zip
         zip.AddEntry("file2.txt", "content2");

         //write other files.....
         zip.Save(os);
      }

      outputStream.Position = 0;
      return File(outputStream, "application/zip", "filename.zip");

¡Espero que esto ayude!

Yogendra Singh avatar Oct 03 '2012 17:10 Yogendra Singh

Mire esta solución SO: Archivo Zip de transmisión MVC

La ventaja de esta solución es que transmite el archivo al cliente.

Implementé esta solución hace un par de días y funcionó fantástico.

Shai Cohen avatar Oct 03 '2012 20:10 Shai Cohen