ASP.NET 웹 애플리케이션에서 아카이브 다운로드
서버에서 아카이브 다운로드
웹 서버에서 파일을 다운로드하는 것은 웹 응용 프로그램의 일반적인 기능입니다. 유선으로 전송되는 데이터 크기를 줄이려면 파일을 압축할 수 있습니다. 다운로드할 아카이브의 형식을 사용자가 선택하는 것이 편리합니다. 이 샘플은 이를 관리하는 방법에 대한 몇 가지 통찰력을 제공합니다.
ASP.NET 웹 애플리케이션 준비
Visual Studio를 사용하여 ASP.NET Core 웹 애플리케이션을 작성합니다. Razor Pages를 사용하여 간단한 웹 애플리케이션을 만들어 보겠습니다.
NuGet 패키지 관리자를 사용하면 프로젝트에 두 개의 패키지, 즉 압축용
Aspose.Zip과 샘플 데이터 생성용
Aspose.BarCode가 포함됩니다.
솔루션 탐색기에서 Index.cshtml
페이지를 찾으세요. 이제 제출 버튼이 있는 페이지에 양식을 추가하세요. 사용자가 다운로드 요청을 시작해야 했습니다.
HTML 마크업 다음에 해당 페이지에 추가하십시오.
1<form method="post">
2 <input type="submit" value="Download" />
3</form>
목록 아카이브 형식
이 샘플에서는
아카이브 형식 중 세 가지를 선택했습니다. Aspose.ZIP은 ZIP, Bzip2, 7z를 지원합니다.
해당 멤버를
DisplayAttribute로 표시하는 형식에 대한 열거를 작성합니다.
열거 코드는 다음과 같습니다.
1 public enum ArchiveFormat
2 {
3 [Display(Name = "ZIP")]
4 Zip,
5
6 [Display(Name = "Bzip2")]
7 Bz2,
8
9 [Display(Name = "7z")]
10 SevenZip
11 }
다음으로 웹 양식 내에 드롭다운 목록을 만들어야 합니다.
GetEnumSelectList Html 도우미를 사용하면 매우 간단합니다. 루프를 사용하여 항목을 생성할 필요가 없습니다.
다음 코드 조각을 Index.cshtml
에 양식 안에 넣으세요.
1<select name="archiveFormat" asp-items="Html.GetEnumSelectList<ArchiveFormat>()"></select>
응용프로그램을 실행하고 색인 페이지를 살펴보십시오. 다음과 같은 내용이 표시됩니다.
사용자 요청 처리
따라서 사용자는 원하는 아카이브 형식을 지정하고 “다운로드"를 누릅니다. 서버 측에서 그의 요청을 어떻게 처리합니까? ASP.NET 접근 방식을 사용하여 Index.cshtml.cs
소스에 적절한 OnPost
메서드를 구성해야 합니다. 방법의 초안은 다음과 같습니다.
1
2
3 public FileStreamResult OnPost([FromForm] ArchiveFormat archiveFormat)
4 {
5 switch (archiveFormat)
6 {
7 case ArchiveFormat.Zip:
8 ...
9 return new FileStreamResult(result, "application/zip") {FileDownloadName = "barcode.zip"};
10 case ArchiveFormat.Bzip2:
11 ...
12 return new FileStreamResult(result, "application/x-bzip2") {FileDownloadName = "barcode.bmp.bz2"};
13 case ArchiveFormat.SevenZip:
14 ...
15 return new FileStreamResult(result, "application/x-7z-compressed") {FileDownloadName = "barcode.7z"};
16 }
17 }
따라서 요청된 아카이브 유형에 대해 샘플 데이터(result
변수)에서 해당 아카이브를 준비하고 적절한 MIME 유형을 갖는 Microsoft.AspNetCore.Mvc.FileStreamResult
로 응답해야 합니다.
샘플 데이터 생성 중
이 지침을 사용하여 바코드의 BMP 이미지를 생성하기 위해 Aspose.BarCode 라이브러리를 사용합니다. 데이터 스트림 생성의 스니펫:
1 private Stream GenerateBarcode()
2 {
3 var generator = new Aspose.BarCode.Generation.BarcodeGenerator(
4 Aspose.BarCode.Generation.EncodeTypes.Pdf417, "This is a test code text. \n Second line \n third line.");
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 }
답변 마무리
이제 GenerateBarcode
메소드의 원시 데이터 스트림이 있습니다. 모든 경우에 적절하게 압축하십시오. 아래는 최종 OnPost
메소드입니다.
1 public FileStreamResult OnPost([FromForm] ArchiveFormat archiveFormat)
2 {
3 using (var barcode = this.GenerateBarcode())
4 {
5 var result = new MemoryStream();
6 switch (archiveFormat)
7 {
8 case ArchiveFormat.Zip:
9 using (Archive a = new Archive())
10 {
11 a.CreateEntry("barcode.bmp", barcode);
12 a.Save(result);
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 }