Devolver varios archivos de la acción MVC
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...
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")
}
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.js
el 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
Recomendaría crear un zip
archivo que incluya ambos archivos siguiendo los pasos (ALGORITMO):
- Cree un archivo Zip y agregue los archivos deseados en el zip
- 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 zip
creado el archivo, devuelva el zip
archivo 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!
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.