Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

posted at

updated at

Organization

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

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);
}

参考記事

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?