0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

アイエンターAdvent Calendar 2020

Day 19

【Razor Pages】BlobストレージからファイルをZip化してダウンロードする

Last updated at Posted at 2020-12-19

Razor PagesでBlobストレージに格納したファイルを取得し、ZIPファイルとしてダウンロードさせるボタンを実装します。

実装する機能

  • クリック時にpostリクエストを実行するボタン
  • Blobストレージからファイルを取得
  • ファイルをZIP化してダウンロード

環境

  • .NET Core 3.1.9
  • Azure.Storage.Blobs 12.7.0
  • Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 3.1.9

postリクエストを実行するボタン

asp-page-handlerでハンドラメソッドを指定します。

Index.cshtml
<form method="post">
    <input asp-page-handler="Download" value="ダウンロード" type="submit" />
</form>

OnPostDownloadで上記リクエストを受け取れます。
今回はDonwloadメソッドを実行するように実装します。

Index.cshtml.cs
public async Task<IActionResult> OnPostDownload()
{
     return await Download();
}       

Blobストレージからファイルを取得

今回はSAS URIでアクセスします。
ファイルを格納しているコンテナーのSAS URIを取得します。

  • SAS URI: http://xxxxx/xxxx
Index.cshtml.cs Download()
// SAS URI
string sasUri = "http://xxxxx/xxxx";
// ダウンロード対象のファイル名
string targetFileName = "testFile.txt";

BlobContainerClient containerClient = new BlobContainerClient(new Uri(sasUri), null);
BlobClient blobClient = containerClient.GetBlobClient(targetFileName);
BlobDownloadInfo downloadInfo = await blob.DownloadAsync();

ファイルをZIP化してダウンロード

メモリストリームでZIP化処理を実行します。

Index.cshtml.cs Download()
byte[] compressedBytes;

using (var memoryStream = new MemoryStream())
{
    using (var zipArchive = new ZipArchive(outStream, ZipArchiveMode.Create, true))
    {
        var entry = zipArchive.CreateEntry(targetFileName);
        using (var es = entry.Open())
        {
            //Blobストレージから取得したファイルをコピー
            await downloadInfo.Content.CopyToAsync(es);
        }
    }
    compressedBytes = memoryStream.ToArray();
}

Zip化したファイルをレスポンスとして返します。

Index.cshtml.cs Download()
string zipName ="test.zip";
return File(compressedBytes, "application/zip", zipName);

まとめ

完成したソースコードです。

フォームのダウンロードボタン

Index.cshtml
<form method="post">
    <input asp-page-handler="Download" value="ダウンロード" type="submit" />
</form>

POSTのハンドラメソッド

Index.cshtml.cs OnPostDownload()
public async Task<IActionResult> OnPostDownload()
{
     return await Download();
}       

Downloadメソッド

2つのファイルを取得し、ZIP化するようにしました。

Index.cshtml.cs Download()
public async Task<IActionResult> Download()
{
    // SAS URI
    string sasUri = "http://xxxxx/xxxx";
    // ダウンロード対象のファイル名
    string[] targetFileNameList = {"testFile1.txt", "testFile2.txt"};
    
    BlobContainerClient containerClient = new BlobContainerClient(new Uri(sasUri), null);

    byte[] compressedBytes;

    using (var memoryStream = new MemoryStream())
    {
        using (var zipArchive = new ZipArchive(outStream, ZipArchiveMode.Create, true))
        {
            foreach (var targetFileName in targetFileNameList)
            {
                BlobClient blobClient = containerClient.GetBlobClient(targetFileName);
                var entry = zipArchive.CreateEntry(targetFileName);
                using (var es = entry.Open())
                {
                    //Blobストレージから取得したファイルをコピー
                    await downloadInfo.Content.CopyToAsync(es);
                }
            }
        }
        compressedBytes = memoryStream.ToArray();
    }

    string zipName ="test.zip";
    return File(compressedBytes, "application/zip", zipName);
}

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?