連続投稿です。こんどは、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(); }