Descargar archivo desde la aplicación web ASP.NET

Descargar archivo del servidor

Es una característica común de las aplicaciones web descargar un archivo desde su servidor web. Para reducir el tamaño de los datos transferidos por cable, es posible que desee comprimir el archivo. Es conveniente que el usuario elija el formato del archivo a descargar. Este ejemplo le brinda algunas ideas sobre cómo administrarlo.

Preparar la aplicación web ASP.NET

Usando Visual Studio compón la aplicación web ASP.NET Core. Que sea una aplicación web sencilla con Razor Pages. Al utilizar NuGet Package Manager, incluye dos paquetes para su proyecto: Aspose.Zip para compresión y Aspose.BarCode para generación de datos de muestra.
Busque la página Index.cshtml dentro de su Explorador de soluciones. Ahora, agregue un formulario a esa página con un botón de envío dentro. Necesitaba iniciar la solicitud de descarga por parte del usuario.
Agregue a esa página el siguiente formato HTML:

1<form method="post">    
2    <input type="submit" value="Download" />
3</form>

Listar formatos de archivo

Para este ejemplo, elegimos tres de los formatos de archivo que Aspose.ZIP admite: ZIP, Bzip2, 7z. Redacte una enumeración para aquellos formatos que marquen a sus miembros con DisplayAttribute
El código de enumeración será:

 1  enumeración pública ArchiveFormat
 2  {
 3      [Mostrar(Nombre = "ZIP")]
 4      Cremallera,
 5
 6      [Display(Name = "Bzip2")]
 7      Bz2,
 8
 9      [Display(Name = "7z")]
10      SevenZip
11  }

A continuación, debe crear una lista desplegable dentro del formulario web. Es bastante simple con el asistente HTML GetEnumSelectList: no es necesario generar elementos con un bucle. Simplemente coloque dentro de su formulario en Index.cshtml el siguiente fragmento:

1<seleccione name="archiveFormat" asp-items="Html.GetEnumSelectList<ArchiveFormat>()"></select>

Ejecute la aplicación y busque la página de índice. Verás algo como eso:

Manejando la solicitud del usuario

Entonces, el usuario especifica el formato de archivo deseado y presiona “Descargar”. ¿Cómo manejar su solicitud en el lado del servidor? Usando el enfoque ASP.NET necesitamos componer un método OnPost apropiado para la fuente Index.cshtml.cs. Aquí está el borrador del método:

 1 
 2
 3  public FileStreamResult OnPost([FromForm] ArchiveFormat archiveFormat)
 4  {
 5    cambiar (formato de archivo)
 6    {
 7      caso ArchiveFormat.Zip:
 8        ...
 9        devolver nuevo FileStreamResult(resultado, "aplicación/zip") {FileDownloadName = "código de barras.zip"};
10      caso ArchiveFormat.Bzip2:
11        ...
12        devolver nuevo FileStreamResult(resultado, "application/x-bzip2") {FileDownloadName = "barcode.bmp.bz2"};
13      caso ArchiveFormat.SevenZip:
14        ...
15        devolver nuevo FileStreamResult(resultado, "aplicación/x-7z-comprimido") {FileDownloadName = "barcode.7z"};                           
16    }
17  }

Entonces, para el tipo de archivo solicitado debemos preparar el archivo correspondiente a partir de datos de muestra (variable resultado) y responder con Microsoft.AspNetCore.Mvc.FileStreamResult que tenga el tipo MIME adecuado.

Generando datos de muestra

Usamos la biblioteca Aspose.BarCode para generar una imagen BMP de código de barras usando esta instrucción. El fragmento de la generación del flujo de datos:

 1  Stream privado Generar código de barras()
 2  {
 3    generador var = nuevo Aspose.BarCode.Generation.BarcodeGenerator(
 4        Aspose.BarCode.Generation.EncodeTypes.Pdf417, "Este es un texto de código de prueba. \n Segunda línea \n tercera línea.");
 5              
 6    generator.Parameters.Barcode.XDimension.Millimeters = 0.6f;
 7    generator.Parameters.Barcode.BarHeight.Millimeters = 1.2f;
 8
 9    MemoryStream result = new MemoryStream();
10    generator.Save(result, Aspose.BarCode.Generation.BarCodeImageFormat.Bmp);
11    result.Seek(0, SeekOrigin.Begin);
12    return result;
13  }

Respuesta final

Ahora tenemos un flujo de datos sin procesar del método “GenerateBarcode”. Comprimirlo adecuadamente en cada caso. A continuación se muestra el método final OnPost.

 1public FileStreamResult OnPost([FromForm] ArchiveFormat archiveFormat)
 2  {
 3      usando (var código de barras = this.GenerateBarcode())
 4      {
 5          resultado var = nuevo MemoryStream();
 6          cambiar (formato de archivo)
 7          {
 8              caso ArchiveFormat.Zip:
 9                  usando (Archivar a = nuevo Archivo())
10                  {
11                      a.CreateEntry("código de barras.bmp", código de barras);
12                      a.Guardar(resultado);
13                  }
14                  
15                  result.Seek(0, SeekOrigin.Begin);
16                  return new FileStreamResult(result, "application/zip") {FileDownloadName = "barcode.zip"};
17              case ArchiveFormat.Bzip2:
18                  using (Bzip2Archive a = new Bzip2Archive())
19                  {
20                      a.SetSource(barcode);
21                      a.Save(result);
22                  }
23
24                  result.Seek(0, SeekOrigin.Begin);
25                  return new FileStreamResult(result, "application/x-bzip2") {FileDownloadName = "barcode.bmp.bz2"};
26              case ArchiveFormat.SevenZip:
27                  using (SevenZipArchive a = new SevenZipArchive())
28                  {
29                      a.CreateEntry("barcode.bmp", barcode);
30                      a.Save(result);
31                  }
32
33                  result.Seek(0, SeekOrigin.Begin);
34                  return new FileStreamResult(result, "application/x-7z-compressed") {FileDownloadName = "barcode.7z"};
35              default:
36                  throw new ArgumentOutOfRangeException(nameof(archiveFormat));
37          }
38      }
39  }

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.