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 1 year has passed since last update.

Azure Blob Storageに画像を保存してパブリックアクセスに

Posted at

AzureBlobStorageへ画像をアップロードして保存。
その際にアップロードしたBlobのURLをパブリックで公開するときのメモ。

AzureBlobStorageへ画像を保存してそのURLはパブリックで〜ってどうやるの?
となり…調べた結果、このやり方でいけました。(ふう。すっきり)
誤字脱字、間違い等は個人の備忘録程度なので何卒ご容赦ください…。
前提としてAzureStorageアカウントは作成済みとして記載してます。
また、フロント側はReactを使用しているのですがそちらの記載も割愛。
(こんどしっかり纏める!)

ライブラリのインストールから接続文字列の設定

dotnet add package Azure.Storage.Blobs

まずライブラリパッケージをインストール。
忘れずにファイルの先頭に追加。

TestController.cs
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;

ストレージアカウントの接続文字をappsettings.jsonに記載します。

appsettings.json
{
  "Logging": {
      "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
      }
    },
"AllowedHosts": "*",
"ConnectionStrings": {
  "StorageAccount": "ストレージアカウントの接続文字列"
  }
}

Contollerの作成

TestController.cs
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
//設定ファイルを読み込むために下記2つのパッケージを使用。
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;

namespace Testsite.Controllers;

[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
  // api/Test POST
  [HttpPost]
  public async Task<IActionResult> testPost(IFormFile image)
  {
    // 設定ファイルを読み込む
    var builder = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false);

    var configuration = builder.Build();

    // 設定ファイルからストレージアカウントの接続文字列を取得
    var connectionString = configuration.GetSection("ConnectionStrings").GetValue<string>("StorageAccount");

    // Blobの名前(Guidメソッドでランダムな文字列を生成) 
    var blobName = "images/" + Guid.NewGuid().ToString();

    try
    {
      var container = new BlobContainerClient(connectionString, "upload-file");

      // コンテナが作成されていなければ作成
      var createResponse = await container.CreateIfNotExistsAsync();

      // BLOB へのアクセス許可 PublicAccsesTypeを変更!
      await container.SetAccessPolicyAsync(PublicAccessType.Blob);
      
      var blob = container.GetBlobClient(blobName);

      // ファイルをBLOBにアップロードする。コンテントタイプはアップロードするファイルに合わせる。
      await blob.UploadAsync(image.OpenReadStream(), new BlobHttpHeaders { ContentType = image.ContentType });
      // アップロードしたファイルのURLを出力
      Console.WriteLine(blob.Uri.ToString());
      return Ok("ファイルアップロード成功");
    }
    catch (System.Exception)
    {
      throw;
    }
  }
}

コンテナのアクセスタイプを変更するにはSetAccessPolicyAsync(PublicAccessType.Blob)このメソッド
指定したコンテナのアクセスタイプを指定できる。
Blobはblobに対するパブリックな読み取りアクセスを指定できるのだそう。
これでアップロードした画像を即座にパブリックアクセスにすることができました〜
またひとつ勉強になりました!

参考

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?