ÕªÒª£ºÎÞÔðÈÎWindows Azure SDK .NET¿ª·¢ÈëÃÅÆª£¬½«´øÀ´Ò»ÏµÁлù´¡ÎÄÕ£º´ÓWindows Azure¿ª·¢Ç°×¼±¸¹¤×÷¡¢Ê¹ÓÃAzure AD ¹ÜÀíÓû§ÐÅÏ¢¡¢´´½¨¹ÜÀí¡°ÔÆ¡±·þÎñ¡¢µ½Ê¹ÓÃBlob Storage·þÎñµÈ£¬°ïÖú¶ÁÕßÇáÒ×ÉÏÊÖʹÓÃÕâÌ׿ª·¢¹¤¾ß¡£
Íê³ÉÁËÉí·ÝÊÚȨºÍÓû§ÐÅÏ¢¹ÜÀí£¬ÎÒÃÇÖÕÓÚ¿ÉÒÔÕæÕýʹÓÃAzureµÄ·þÎñÁË¡£Azure PaaS·þÎñÖбȽϳöÃûµÄÊ×ÍÆ´æ´¢·þÎñ£¬´æ´¢·þÎñÖбȽϳöÃûµÄÊ×ÍÆBlob Storage·þÎñ£¬±¾ÕÂÎÒÃÇʹÓÃSDK Íê³ÉBlob Storage·þÎñµÄÓ¦Óá£
Blob ´æ´¢Ò»°ãÓÃÓÚ´æ´¢ÎļþÊý¾Ý¡£Blob ¿ÉÒÔÊÇÈκÎÀàÐ͵ÄÎı¾»ò¶þ½øÖÆÊý¾Ý£¬ÈçÎĵµ¡¢Ã½ÌåÎļþ»òÓ¦ÓóÌÐò°²×°³ÌÐò¡£Ò²¾ÍÊÇ˵Blog·Ç³£ÊʺÏÓÃÓÚ´æ´¢ÌṩÏÂÔØµÄÎļþ¡£ÔÚ¿ª·âBlob·þÎñǰ£¬ÄãÐèÒªÁ˽⼸¸ö¸ÅÄî

- ÕÊ»§¡£´æ´¢ÕÊ»§ÊǴ洢ϵͳÖеÄÒ»¸öÈ«¾ÖΨһ±êʶµÄʵÌå¡£ÕÊ»§ÊÇ BLOB ·þÎñµÄ¸¸¼¶ÃüÃû¿Õ¼ä¡£ËùÓÐÈÝÆ÷¶¼ÓëÒ»¸öÕÊ»§¹ØÁª¡£
-
ÈÝÆ÷¡£ÈÝÆ÷ÊÇÕÊ»§ÄÚÒ»×éÓû§¶¨ÒåµÄ Blob¡£ÈÝÆ÷×ÊԴûÓйØÁªµÄÄÚÈÝ£¬Ö»ÓÐÊôÐÔºÍÔªÊý¾Ý¡£ÈÝÆ÷Ãû³Æ±ØÐëÊÇÓÐЧµÄ DNS Ãû³ÆÇÒ·ûºÏÒÔÏÂÃüÃû¹æÔò
-
Blob¡£Blob ÊDZíʾһ×éÄÚÈݵÄʵÌå¡£Blob ×ÊÔ´°üº¬ÄÚÈÝ¡¢ÊôÐÔºÍÔªÊý¾Ý¡£Blob Ãû³Æ¿ÉÒÔ°üº¬ÈκÎ×Ö·û×éºÏ£¬³¤¶È±ØÐëÖÁÉÙΪ 1 ¸ö×Ö·û£¬ÇÒ²»Äܳ¬¹ý 1,024 ¸ö×Ö·û¡£Blob Ãû³ÆÇø·Ö´óСд£¬ÇÒ×é³É Blob Ãû³ÆµÄ·¾¶¶ÎÊýÄ¿²»Äܳ¬¹ý 254 ¸ö¡£´ó²¿·ÖÎļþÊÇ¿é blobs¡£µ¥¸ö¿é blob ×î´ó¿ÉÒÔΪ 200 GB¡£
-
URL ¸ñʽ£º Blob ¿ÉʹÓÃÒÔÏ URL ¸ñʽѰַ£ºhttp://<storage account>.blob.core.chinacloudapi.cn/<container>/<blob>
ÄãÒ»¶¨Òª¼Çס£ºBLOB ·þÎñ»ùÓÚÆ½Ãæ´æ´¢·½°¸¶ø²»ÊǷֲ㷽°¸¡£µ«ÊÇ£¬¿ÉÒÔÔÚ Blob Ãû³ÆÖÐÖ¸¶¨×Ö·û»ò×Ö·û´®·Ö¸ô·ûÀ´´´½¨ÐéÄâ²ã´Î½á¹¹¡£
ʹÓÃBlob Storage·þÎñÎÒÃÇÐèÒªÔÚÅäÖÃÎļþдÈë´æ´¢×ÊÔ´µÄÁ¬½Ó×Ö·û´®£¬Õâ¸ö¸ÅÄîÀàËÆÊý¾Ý¿âµÄÁ¬½Ó×Ö·û´®¡£Á¬½Ó×Ö·û´®ÔÚappSettings½ÚµãÖÐ
<add key="Microsoft.ServiceBus.Namespace" value="Endpoint=sb://<ÄãµÄ´æ´¢Á´½Óurl>/;SharedAccessKeyName=<ÄãµÄ¹²ÏíÃÜÔ¿>" /> <add key="Microsoft.WindowsAzure.Storage" value="BlobEndpoint=<ÄãµÄ´æ´¢×ÊÔ´Á´½Ó>/;QueueEndpoint=<ÄãµÄ´æ´¢×ÊÔ´Á´½Ó>; TableEndpoint=<ÄãµÄ´æ´¢×ÊÔ´Á´½Ó>/; AccountName=<ÄãµÄ´æ´¢×ÊÔ´Ãû³Æ>; AccountKey=<ÄãµÄ´æ´¢×ÊÔ´·ÃÎÊÃÜÔ¿> " />
|
ÎÒÃÇÐèÒª´ÓNuGet»ñÈ¡WindowsAzure.Storage¿â£¬¸Ã¿âµÄÏîÄ¿µØÖ·ÊÇ£ºhttps://www.nuget.org/packages/WindowsAzure.Storage£¬ÒýÓÃÍê³Éºó£¬ÎÒÃǽ¨Á¢±¾ÕµĿØÖÆÆ÷£ºStorageBlobController£¬¸Ã¿ØÖÆÆ÷ÓÐÈçÏÂAction
- Index
-
Create
-
Delete
-
List
-
Upload
[Authorize] public class StorageBlobController : Controller { CloudStorageAccount storageAccount = CloudStorageAccount.Parse (CloudConfigurationManager.GetSetting("Microsoft.WindowsAzure.Storage"));
CloudBlobClient blobClient = null;
public StorageBlobController()
{
blobClient = storageAccount.CreateCloudBlobClient();
}
}
|
Õâ´ÎÎÒÃǽ«[Authorize]¼ÓÔØµ½ControllerÉÏ£¬Òâζ×ű¾´Î¿ØÖÆÆ÷µÄËùÓвÙ×÷¶¼±ØÐë¾¹ýÉí·ÝÑéÖ¤¡£
Ò»¡¢Áгöµ±Ç°´æ´¢Õ˺ÅÈÝÆ÷
´úÂë¼òµ¥µ½ÎÞ·¨Ö±ÊÓ
public ActionResult Index() { var containes = blobClient.ListContainers();
return View(containes);
}
|
¶ÔÓ¦µÄView
@model IEnumerable<Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("´´½¨ÐµÄÈÝÆ÷", "Create")
</p>
<table class="table">
<tr>
<th>Name</th>
<th>StorageUri</th>
<th>Uri</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.ActionLink(@item.Name, "List", new { name = item.Name })
</td>
<td>@item.StorageUri</td>
<td>@item.Uri</td>
<td>
@Html.ActionLink("ÉÏ´«Îļþ", "Upload", new { name = item.Name }) |
@Html.ActionLink("ɾ³ý", "Delete", new { name = item.Name })
</td>
</tr>
}
</table>
|
ÔËÐнá¹ûÈçͼ

¶þ¡¢´´½¨ÐµÄÈÝÆ÷
´´½¨ÐµÄÈÝÆ÷֮ǰÎÒÃDZØÐëÅжÏÓÐûÓÐͬÃû£¬È»ºóÉèÖÃÈÝÆ÷·ÃÎÊȨÏÞ
[HttpPost] public ActionResult Create(string name) { CloudBlobContainer container = blobClient.GetContainerReference(name); container.CreateIfNotExists(); container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });
return RedirectToAction("Index");
}
|
¶ÔÓ¦ViewµÄ´úÂë
@model Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient
@{ ViewBag.Title = "Create";
}
<h2>Create Cloud Blob</h2>
@using (Html.BeginForm()) { @Html.AntiForgeryToken()
@Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.Label ("ÈÝÆ÷Ãû³Æ(ÈÝÆ÷Ãû³ÆÖ»Äܰüº¬Ð¡Ð´×Öĸ¡¢Êý×ÖºÍÁ¬×Ö·û£¬²¢ÇÒ±ØÐëÒÔ×Öĸ»òÊý×Ö¿ªÍ·¡£ Ãû³Æ²»Äܰüº¬Á½¸öÁ¬ÐøµÄÁ¬×Ö·û)") @Html.TextBox("name", "", new { @class = "form-control" }) </div> <div class="form-group"> <input type="submit" value="Create" class="btn btn-default" /> </div> }
<div> @Html.ActionLink("Back to List", "Index") </div>
|
ÔËÐкóÄã¿ÉÒÔÌí¼ÓеÄÈÝÆ÷£¬¹Ø¼ü¾ÍÊÇ£ºÈÝÆ÷Ãû³ÆÖ»Äܰüº¬Ð¡Ð´×Öĸ¡¢Êý×ÖºÍÁ¬×Ö·û£¬²¢ÇÒ±ØÐëÒÔ×Öĸ»òÊý×Ö¿ªÍ·¡£ Ãû³Æ²»Äܰüº¬Á½¸öÁ¬ÐøµÄÁ¬×Ö·û¡£²¢ÇÒSetPermissions±ØÐëÔÚCreateIfNotExists³É¹¦Ö´ÐÐÖ®ºóÔËÐС£

´´½¨³É¹¦ºó·µ»ØIndex

Èý¡¢É¾³ýÈÝÆ÷
ɾ³ýÈÝÆ÷·Ç³£¼òµ¥£¬»ñÈ¡µ½ÈÝÆ÷ÒýÓã¬È»ºóɾ³ý
public ActionResult Delete(string name) { blobClient.GetContainerReference(name).Delete(); return RedirectToAction("Index"); }
|
ËÄ¡¢ÉÏ´«BLOBÎļþ
ÏÖÔÚÊDZ¾ÕÂ×îºóÒ»½Ú£¬Ò²ÊÇ×îÖØÒªµÄÒ»½Ú£¬ÔÚ±¾½ÚÖÐÎÒÃǽ«Á˽⵽ͨ¹ýHTMLµÄFile½«ÎļþÉÏ´«µ½ÈÝÆ÷ÖС£¿ØÖÆÆ÷Öн«HttpPostedFileBaseÎļþÁ÷ÉÏ´«µ½ÈÝÆ÷¡£
[HttpPost] public ActionResult Upload(string name, HttpPostedFileBase[] files) { if (files == null) { return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest); }
CloudBlobContainer container = blobClient.GetContainerReference(name);
foreach (HttpPostedFileBase item in files)
{
string filename = Guid.NewGuid().ToString() + "." + item.FileName.Split('.').Last();
CloudBlockBlob blob = container.GetBlockBlobReference(filename);
blob.UploadFromStream(item.InputStream); }
return RedirectToAction("List", new { name = name });
}
|
¶ÔÓ¦µÄView£¬×¢ÒâFormÐèÒªÉùÃ÷enctype = "multipart/form-data" }
@{ ViewBag.Title = "Upload"; }
<h2>Upload</h2>
@using (@Html.BeginForm("Upload", "StorageBlob", new { name = @ViewBag.Container }, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.Label("Ñ¡ÔñÎļþ")
<input type="file" name="files" multiple/>
<input type="submit" value="ÉÏ´«" />
} |


Äã¿ÉÒÔ¶àÉÏ´«¼¸ÖÖÎļþ£¬±ÈÈçÊÓÆµ¡¢ÒôƵ¡¢Í¼Æ¬ºÍÆäËûÎļþ¡£
Îå¡¢ÁгöÈÝÆ÷Öд洢µÄÊý¾Ý
ÁгöÈÝÆ÷Öд洢µÄÄÚÈݹؼüÊÇÐèÒª½«·µ»ØµÄ¶ÔÏóתΪCloudBlockBlobÀàÐÍ¡£ÔÚView½¨ÒéÄ㽫²»Í¬ÀàÐ͵ÄÎļþ×ö¸üÓѺõÄÏÔʾ£¬±ÈÈçͼƬֱ½ÓÏÔʾͼƬ£¬ÒôƵÎļþÖ±½ÓʹÓÃHTML5µÄÒôƵ²¥·¢Æ÷
public ActionResult List(string name) { CloudBlobContainer container = blobClient.GetContainerReference(name);
var result = container.ListBlobs(null, false).Where (x => x.GetType() == typeof(CloudBlockBlob)).Cast<CloudBlockBlob>();
return View(result);
} |
¶ÔÓ¦µÄView¶Ô²»Í¬ÀàÐÍÎļþ×öÁ˲»Í¬µÄ³ÊÏÖ·½°¸
@model IEnumerable<Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob>
@{
ViewBag.Title = "List";
}
<h2>List</h2>
<p>
@Html.ActionLink("ÉÏ´«Îļþ", "Upload", new { name = @ViewBag.Container })
</p>
<table class="table">
<tr>
<th>Container</th>
<th>Name</th>
<th>Size</th>
<th>Type</th>
<th>Uri</th>
<th>LastDate</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@item.Container.Name</td>
<td>@item.Name</td>
<td>@item.Properties.Length</td>
<td>@item.BlobType</td>
<td>
@{
var fileType = System.IO.Path.GetExtension(item.Name).ToLower();
if (new string[] { ".jpg", ".png" }.Any(x => x == fileType))
{
<img src="@item.Uri" />
}
else if (new string[] { ".ogg", ".mp4" }.Any(x => x == fileType))
{
<video width="320" height="240" controls="controls"> @if (fileType == "ogg")
{
<source src="@item.Uri" type="video/ogg">
}
else
{
<source src="@item.Uri" type="video/mp4">
}
Your browser does not support the video tag.
</video>
}
else if (fileType == ".mp3")
{
<audio controls="controls">
<source src="@item.Uri" type="audio/mpeg">
Your browser does not support the audio tag.
</audio>
}
else
{
<a href="@item.Uri">ÏÂÔØ</a>
}
}
</td>
<td>@item.Properties.LastModified.Value.DateTime</td>
</tr>
}
</table>
|
ÔËÐкóÈçͼ

|