Asp.Net Web Api 2マルチファイルパッケージングを実現し、ファイルサンプルソースコードをダウンロードする


前言
最近、仕事や個人事務のため、サイトも久しぶりに更新されましたが、これは私には影響しません.NETの情熱.サイトの更新作業は何とか時間を割いて行わなければなりません.
要約
今日はお昼の時間を利用してAspについて書きます.Net Web Apiがファイルをダウンロードする文章は、以前にも似たような文章を書いたことがあります.本明細書で実現するサーバ側での使用について.NET圧縮パッケージ機能では、DotNetZipというサードパーティクラスライブラリを使用しています.具体的な使用は本文で説明します.では、このような多くの前言を説明します.次に、本稿の例の本文に入ります.
一、プロジェクトの作成
1.1まず、WebApiDownloadというWeb Apiプロジェクト(C#)を作成する.
1.2次に、空のコントローラを新規作成します.名前はDownloadControllerです.
1.3パッケージファイルと一時ファイルを格納するフォルダ(downloads)を作成します.具体的には、本明細書で最後に提供したサンプルプロジェクトコードを参照してください.
1.4 NuGetパッケージマネージャを開き、DotNetZipを検索します.以下の図です.
DotNetZipインストールパッケージを検索し、以下の図に示すように、本プロジェクトでマルチファイルパッケージ圧縮を実現するためのインストールを行います.
DotNetZipパッケージのインストールが完了すると、このプロジェクトはサンプルプロジェクトであり、他のパッケージを追加する必要がないため、NuGetパッケージマネージャを終了できます.
1.5 Modelsフォルダの下にサンプルデータのクラスを作成します.名前はDemoDataです.メンバーと実装は以下の通りです.
using System.Collections.Generic;

namespace WebApiDownload.Models
{
    public class DemoData
    {
        public static readonly List> Contacts = new List>();
        public static readonly List File1 = new List
        {
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]"
        };
        public static readonly List File2 = new List
        {
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]"
        };
        public static readonly List File3 = new List
        {
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]",
            "[email protected]"
        };

        public static List> GetMultiple
        {
            get
            {
                if (Contacts.Count <= 0)
                {
                    Contacts.Add(File1);
                    Contacts.Add(File2);
                    Contacts.Add(File3);
                }
                return Contacts;
            }
        }
    }
}

1.6ここまで、私たちの準備は基本的にあまり悪くありません.最後に、DownloadControlコントローラで2つのActionを実現する必要があります.1つはDownloadSingle(単一のファイルをダウンロードする機能を提供する)、もう1つはDownloadZip(複数のファイルを圧縮してダウンロードする機能を提供する)です.具体的なDownloadControllerの完全なコードは以下の通りです.
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Web.Http;
using Ionic.Zip;
using WebApiDownload.Models;
using System;
using System.IO;
using System.Net;
using System.Net.Http.Headers;
using System.Threading;
using System.Web;

namespace WebApiDownload.Controllers
{
    [RoutePrefix("download")]
    public class DownloadController : ApiController
    {
        [HttpGet, Route("single")]
        public HttpResponseMessage DownloadSingle()
        {
            var response = new HttpResponseMessage();
            // List     byte[]
            var bytes = DemoData.File1.Select(x => x + "
").SelectMany(x => Encoding.UTF8.GetBytes(x)).ToArray(); try { var fileName = string.Format("download_single_{0}.txt", DateTime.Now.ToString("yyyyMMddHHmmss")); var content = new ByteArrayContent(bytes); response.Content = content; response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName }; response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); } catch (Exception ex) { response.StatusCode = HttpStatusCode.InternalServerError; response.Content = new StringContent(ex.ToString()); } return response; } [HttpGet, Route("zip")] public HttpResponseMessage DownloadZip() { var response = new HttpResponseMessage(); try { var zipFileName = string.Format("download_compressed_{0}.zip", DateTime.Now.ToString("yyyyMMddHHmmss")); var downloadDir = HttpContext.Current.Server.MapPath($"~/downloads/download"); var archive = $"{downloadDir}/{zipFileName}"; var temp = HttpContext.Current.Server.MapPath("~/downloads/temp"); // Directory.EnumerateFiles(temp).ToList().ForEach(File.Delete); ClearDownloadDirectory(downloadDir); // var counter = 1; foreach (var c in DemoData.GetMultiple) { var fileName = string.Format("each_file_{0}_{1}.txt", counter, DateTime.Now.ToString("yyyyMMddHHmmss")); if (c.Count <= 0) { continue; } var docPath = string.Format("{0}/{1}", temp, fileName); File.WriteAllLines(docPath, c, Encoding.UTF8); counter++; } Thread.Sleep(500); using (var zip = new ZipFile()) { // Make zip file zip.AddDirectory(temp); zip.Save(archive); } response.Content = new StreamContent(new FileStream(archive, FileMode.Open, FileAccess.Read)); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = zipFileName }; response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); } catch (Exception ex) { response.StatusCode = HttpStatusCode.InternalServerError; response.Content = new StringContent(ex.ToString()); } return response; } private void ClearDownloadDirectory(string directory) { var files = Directory.GetFiles(directory); foreach (var file in files) { try { File.Delete(file); } catch { } } } } }

二、運行例
2.1これで、この例の実装コードのセクションは完了します.アドレスを開くと、次のようになります.http://localhost:63161/download/single2.2このファイルを保存した後、それを開くと、サンプルデータがローカルに保存されていることがわかります.次のようになります.
私のウェブサイトの文章:Asp.Net Web Api 2は、ByteArrayContentとStreamContentを用いて、ダウンロードファイルのサンプルソースコード(マルチファイル圧縮機能を含む)をそれぞれ実現する