《Windows Azure Platform 系列文章目录》
如果读者使用的是国内由世纪互联运维的Azure China服务,请参考笔者的博文Azure China (4) 管理Azure China Storage Account
如果需要参考Azure China使用SAS Token的Sample Code,请参考笔者的博文:Azure China (10) 使用Azure China SAS Token
本章我们会介绍如何在本地模拟器使用Blob Storage存储图片。
关于Blob Storage的概念,请参考 Windows Azure Platform (七) Windows Azure Storage Service存储服务 。
在开始介绍之前,请确保您已经下载了最新的Windows Azure开发工具,我使用的是1.6版本。本次介绍使用Visual Studio 2010作为开发工具。
Azure Container属性有三种
- Private:不允许匿名用户读取该容器中的Blob;
- Public Container:匿名用户可以读取该Container,并且可以列出Container所有Blob内容;
- Blob:匿名用户只能读取Blob,即只能根据Blob的URL来读取Blob,无法列出Container下所有的Blob。
1.新建Azure Project
以管理员身份运行Visual Studio 2010,并新建一个Windows Azure Project,我命名为AzureBlobStorage
然后选择WebRole-->右键-->属性
在Settings页面,Add Setting,类型选择Connection String,并且按最右边的"..."按钮
选择"Use the Windows Azure storage emulator",然后选择"OK"
然后添加另外一个Setting(设置),叫做ContainerName并且把它的Type改成"String",值设置成gallery
注意:
Container和Blob的命名规则!
2.打开Default.aspx.cs
添加引用命名空间
using Microsoft.WindowsAzure.StorageClient;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using System.Collections.Specialized;
using Microsoft.WindowsAzure.StorageClient.Protocol;
前端的ASPX添加如下控件:
然后添加代码内容:
namespace MyWebRole
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.EnsureContainerExists();
}
}
private void EnsureContainerExists()
{
var container = GetContainer();
// 检查container是否被创建,如果没有,创建container
container.CreateIfNotExist();
var permissions = container.GetPermissions();
//对Storage的访问权限是可以浏览Container
permissions.PublicAccess = BlobContainerPublicAccessType.Container;
container.SetPermissions(permissions);
}
private CloudBlobContainer GetContainer()
{
//获取ServiceConfiguration.cscfg配置文件的信息
var account = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
var client = account.CreateCloudBlobClient();
//获得BlobContainer对象
return client.GetContainerReference(RoleEnvironment.GetConfigurationSettingValue("ContainerName"));
}
protected void upload_Click(object sender, EventArgs e)
{
if (imageFile.HasFile)
{
//输出图片文件的信息
status.Text = "Inserted [" + imageFile.FileName + "] - Content Type [" + imageFile.PostedFile.ContentType + "] - Length [" + imageFile.PostedFile.ContentLength + "]";
this.SaveImage(imageFile.FileName,imageFile.PostedFile.ContentType,imageFile.FileBytes);
}
else
status.Text = "No image file";
}
private void SaveImage(string fileName, string contentType, byte[] data)
{
//获得BlobContainer对象并把文件上传到这个Container
var blob = this.GetContainer().GetBlobReference(fileName);
blob.Properties.ContentType = contentType;
// 创建元数据信息
var metadata = new NameValueCollection();
metadata["Name"] = fileName;
// 上传图片
blob.Metadata.Add(metadata);
blob.UploadByteArray(data);
}
//发现Azure Storage升级到2.0后API变了
private void SaveImage(string fileName, string contentType, byte[] data)
{
//获得BlobContainer对象并把文件上传到这个Container
var blob = this.GetContainer().GetBlockBlobReference(fileName);
blob.Properties.ContentType = contentType;
using (var ms = new MemoryStream(data, false))
{
blob.UploadFromStream(ms);
}
}
}
3.打开Global.asax.cs文件,添加如下代码
void Application_Start(object sender, EventArgs e)
{
// This code sets up a handler to update CloudStorageAccount instances when their corresponding
// configuration settings change in the service configuration file.
CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
{
// Provide the configSetter with the initial value
configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
});
}
4.运行应用程序,使用FileUpload查找本地图片,然后点击"Upload Image",图片就能上传到本地Storage Emulator的Blob里了。
6.打开Visual Studio,展开左侧的Server Explorer列表,依次展开Windows Azure Storage-->Development-->Blob-->gallery
其中Developement表示我使用的是本地的模拟器
gallery就是我前面设置的Blob Container
我们选中Azure.jpg,右键属性,可以看使用Storage Emluator后在本地的URL
我们可以通过打开本地的浏览器来查看。
5.下载我的工程文件:AzureBlobStorage.rar