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です.メンバーと実装は以下の通りです.
1.6ここまで、私たちの準備は基本的にあまり悪くありません.最後に、DownloadControlコントローラで2つのActionを実現する必要があります.1つはDownloadSingle(単一のファイルをダウンロードする機能を提供する)、もう1つはDownloadZip(複数のファイルを圧縮してダウンロードする機能を提供する)です.具体的なDownloadControllerの完全なコードは以下の通りです.
二、運行例
2.1これで、この例の実装コードのセクションは完了します.アドレスを開くと、次のようになります.http://localhost:63161/download/single2.2このファイルを保存した後、それを開くと、サンプルデータがローカルに保存されていることがわかります.次のようになります.
私のウェブサイトの文章:Asp.Net Web Api 2は、ByteArrayContentとStreamContentを用いて、ダウンロードファイルのサンプルソースコード(マルチファイル圧縮機能を含む)をそれぞれ実現する
最近、仕事や個人事務のため、サイトも久しぶりに更新されましたが、これは私には影響しません.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を用いて、ダウンロードファイルのサンプルソースコード(マルチファイル圧縮機能を含む)をそれぞれ実現する