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に対するパブリックな読み取りアクセスを指定できるのだそう。
これでアップロードした画像を即座にパブリックアクセスにすることができました〜
またひとつ勉強になりました!
参考