Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

SASによる書き込み

連続投稿です。こんどは、SASによる書き込みです。

先ほどと違うのは、SASパーミッションにWrite権を与えているところです。 アップロードには、BlobHttpWebRequestFactoryでHttpWebRequestを作成しつつ、REST APIを呼んでPutBlobしています。純粋に自分で、HttpWebRequestをコンストラクトするより楽なので。ファイルサイズが大きい場合とかもうちっと考慮が必要そうですが。

例によってLinqPadによる実行です。

void Main()
{
    string name = "...";
    string key  = "...";
    
    var creds = new StorageCredentials(name, key);
    var account = new CloudStorageAccount(creds, false);
    var client = account.CreateCloudBlobClient();
    var container = client.GetContainerReference("pictures");
    
    container.CreateIfNotExists();
    
    var blob = container.GetBlockBlobReference("b.png");

    // 前後5分 書き込み権限を与える
    var sas = blob.GetSharedAccessSignature(new SharedAccessBlobPolicy()
    {
       SharedAccessStartTime  = DateTime.UtcNow.AddMinutes(-5),
       SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(+5),
       Permissions = SharedAccessBlobPermissions.Write
    });

    // オリジナルURI
    Console.WriteLine (blob.Uri.AbsoluteUri);
    // SAS付URIC
    Console.WriteLine (blob.Uri.AbsoluteUri + sas);
    
    
    string file = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + @"/a.png";
    var bin = File.ReadAllBytes(file);
    
    // Put Blob用のRequest作成
    var req = BlobHttpWebRequestFactory.Put(new Uri(blob.Uri.AbsoluteUri + sas),
        90, // timeout
        new BlobProperties() {
            ContentType = "image/png",
        },
        BlobType.BlockBlob, // page or block
        0, // page blob size
        AccessCondition.GenerateEmptyCondition(),
        new OperationContext());

    // 長さ
    req.ContentLength = bin.Length;
    
        // Upload file
    using(var ws = req.GetRequestStream())
    {
        ws.Write(bin, 0, bin.Length);
    }
    
    var res = req.GetResponse();
    new StreamReader(res.GetResponseStream()).ReadToEnd().Dump();

}