一个使用微软Azure blob实现文件下载功能的实例-附带源文件
Running the sample
Please follow the steps below.
Step 1: Open the CSAzureServeFilesFromBlobStorage.sln as Administrator. Expand the CSAzureServeFilesFromBlobStorage application and set CSAzureServeFilesFromBlobStorage azure application as the startup project, press F5 to display Default.aspx page.
Step 2: Please add your Windows Azure Storage Account and Key in the Windows Azure settings, "StorageConnections". If you do not have one, please use Windows Azure Storage Emulator. You will see a web page with two unavailable links on it. Please click the link "Add default resources page" to redirect to default resources adding page.

Step 3: Click the "Click to upload the default resources" button to upload your resources to Windows Azure Blob Storage and Table Storage. You can find "Microsoft.jpg, MSDN.jpg and Site.css" in the "Files" folder. These files will be uploaded to the blob container and their information will be stored in table storage.

Step 4: The files have been uploaded now. You can go to Microsoft Windows Azure Management Portal or use Azure Storage Explore tool to view your resources. The default blob container name is "container" and default table name is "files".


Step 5: Go back to the Default.aspx page. You will find the uploaded resources appear on it. Click the link to view them.

Step 6: In this sample, you can access jpg and css files (also including .aspx files). Files of other types, such as .htm files, cannot be reached.

Step 7: Validation finished.
Using the Code
Step 1. Create a C# "Windows Azure Project" in Visual Studio 2012. Name it as "CSAzureServeFilesFromBlobStorage". Add a Web Role and name it as "ServeFilesFromBlobStorageWebRole"; add a class library and name it as "TableStorageManager". Make sure the class library's target framework is .NET Framework 4.5 (Not .NET Framework 4.5 Client Profile).
Step 2. Add 3 class files in TableStorageManager class library, which is used to package the bottom table storage methods. Try to add Windows Azure references and Data Service client reference.
• Microsoft.WindowsAzure.Diagonostics
• Microsoft.WindowsAzure.ServiceRuntime
• Microsoft.WindowsAzure.StorageClient
• System.Data.Service.Client
The FileEntity class is a table storage entity class; it includes some basic properties. The FileContext class is used to create queries for table services. You can also add paging method for table storage. The FileDataSource package the bottom layer methods (about cloud account, TableServiceContext, credentials, etc)
C#
Edit|Remove
csharp
public class FileDataSource
{
private static CloudStorageAccount account;
private FileContext context;
public FileDataSource()
{
// Create table storage client via cloud account.
account = CloudStorageAccount.FromConfigurationSetting("StorageConnections");
CloudTableClient client = account.CreateCloudTableClient();
client.CreateTableIfNotExist("files");
// Table context properties.
context = new FileContext(account.TableEndpoint.AbsoluteUri, account.Credentials);
context.RetryPolicy = RetryPolicies.Retry(3, TimeSpan.FromSeconds(1));
context.IgnoreResourceNotFoundException = true;
context.IgnoreMissingProperties = true;
}
/// <summary>
/// Get all entities method.
/// </summary>
/// <returns></returns>
public IEnumerable<FileEntity> GetAllEntities()
{
var list = from m in this.context.GetEntities
select m;
return list;
}
/// <summary>
/// Get table rows by partitionKey.
/// </summary>
/// <param name="partitionKey"></param>
/// <returns></returns>
public IEnumerable<FileEntity> GetEntities(string partitionKey)
{
var list = from m in this.context.GetEntities
where m.PartitionKey == partitionKey
select m;
return list;
}
/// <summary>
/// Get specify entity.
/// </summary>
/// <param name="partitionKey"></param>
/// <param name="fileName"></param>
/// <returns></returns>
public FileEntity GetEntitiesByName(string partitionKey, string fileName)
{
var list = from m in this.context.GetEntities
where m.PartitionKey == partitionKey && m.FileName == fileName
select m;
if (list.Count() > 0)
return list.First<FileEntity>();
else
return null;
}
/// <summary>
/// Add an entity.
/// </summary>
/// <param name="entity"></param>
public void AddFile(FileEntity entity)
{
this.context.AddObject("files", entity);
this.context.SaveChanges();
}
/// <summary>
/// Make a judgment to check if file is exists.
/// </summary>
/// <param name="filename"></param>
/// <param name="partitionKey"></param>
/// <returns></returns>
public bool FileExists(string filename, string partitionKey)
{
IEnumerable<FileEntity> list = from m in this.context.GetEntities
where m.FileName == filename && m.PartitionKey == partitionKey
select m;
if (list.Count()>0)
{
return true;
}
else
{
return false;
}
}
}
public class FileDataSource
{
private static CloudStorageAccount account;
private FileContext context;
public FileDataSource()
{
// Create table storage client via cloud account.
account = CloudStorageAccount.FromConfigurationSetting("StorageConnections");
CloudTableClient client = account.CreateCloudTableClient();
client.CreateTableIfNotExist("files");
// Table context properties.
context = new FileContext(account.TableEndpoint.AbsoluteUri, account.Credentials);
context.RetryPolicy = RetryPolicies.Retry(3, TimeSpan.FromSeconds(1));
context.IgnoreResourceNotFoundException = true;
context.IgnoreMissingProperties = true;
}
/// <summary>
/// Get all entities method.
/// </summary>
/// <returns></returns>
public IEnumerable<FileEntity> GetAllEntities()
{
var list = from m in this.context.GetEntities
select m;
return list;
}
/// <summary>
/// Get table rows by partitionKey.
/// </summary>
/// <param name="partitionKey"></param>
/// <returns></returns>
public IEnumerable<FileEntity> GetEntities(string partitionKey)
{
var list = from m in this.context.GetEntities
where m.PartitionKey == partitionKey
select m;
return list;
}
/// <summary>
/// Get specify entity.
/// </summary>
/// <param name="partitionKey"></param>
/// <param name="fileName"></param>
/// <returns></returns>
public FileEntity GetEntitiesByName(string partitionKey, string fileName)
{
var list = from m in this.context.GetEntities
where m.PartitionKey == partitionKey && m.FileName == fileName
select m;
if (list.Count() > 0)
return list.First<FileEntity>();
else
return null;
}
/// <summary>
/// Add an entity.
/// </summary>
/// <param name="entity"></param>
public void AddFile(FileEntity entity)
{
this.context.AddObject("files", entity);
this.context.SaveChanges();
}
/// <summary>
/// Make a judgment to check if file is exists.
/// </summary>
/// <param name="filename"></param>
/// <param name="partitionKey"></param>
/// <returns></returns>
public bool FileExists(string filename, string partitionKey)
{
IEnumerable<FileEntity> list = from m in this.context.GetEntities
where m.FileName == filename && m.PartitionKey == partitionKey
select m;
if (list.Count()>0)
{
return true;
}
else
{
return false;
}
}
}
Step 3. Then we need add a class in ServeFilesFromBlobStorageWebRole project as an HttpModuler to check the types of requested files and access the files in Blob Storage.
C#
Edit|Remove
csharp
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(this.Application_BeginRequest);
}
/// <summary>
/// Check file types and request it by cloud blob API.
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void Application_BeginRequest(Object source,EventArgs e)
{
string url = HttpContext.Current.Request.Url.ToString();
string fileName = url.Substring(url.LastIndexOf('/') + 1).ToString();
string extensionName = string.Empty;
if (fileName.Substring(fileName.LastIndexOf('.') + 1).ToString().Equals("aspx"))
{
return;
}
if (!fileName.Equals(string.Empty))
{
extensionName = fileName.Substring(fileName.LastIndexOf('.') + 1).ToString();
if (!extensionName.Equals(string.Empty))
{
string contentType = this.GetContentType(fileName);
if (contentType.Equals(string.Empty))
{
HttpContext.Current.Server.Transfer("NoHandler.aspx");
};
{
FileDataSource dataSource = new FileDataSource();
string paritionKey = this.GetPartitionName(extensionName);
if (String.IsNullOrEmpty(paritionKey))
{
HttpContext.Current.Server.Transfer("NoHandler.aspx");
}
FileEntity entity = dataSource.GetEntitiesByName(paritionKey, "Files/" + fileName);
if (entity != null)
HttpContext.Current.Response.Redirect(entity.FileUrl);
else
HttpContext.Current.Server.Transfer("NoResources.aspx");
}
}
}
}
/// <summary>
/// Get file's Content-Type.
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public string GetContentType(string filename)
{
string res = string.Empty;
switch (filename.Substring(filename.LastIndexOf('.') + 1).ToString().ToLower())
{
case "jpg":
res = "image/jpg";
break;
case "css":
res = "text/css";
break;
}
return res;
}
/// <summary>
/// Get file's partitionKey.
/// </summary>
/// <param name="extensionName"></param>
/// <returns></returns>
public string GetPartitionName(string extensionName)
{
string partitionName = string.Empty;
switch(extensionName)
{
case "jpg":
partitionName = "image";
break;
case "css":
partitionName = "css";
break;
}
return partitionName;
}
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(this.Application_BeginRequest);
}
/// <summary>
/// Check file types and request it by cloud blob API.
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void Application_BeginRequest(Object source,EventArgs e)
{
string url = HttpContext.Current.Request.Url.ToString();
string fileName = url.Substring(url.LastIndexOf('/') + 1).ToString();
string extensionName = string.Empty;
if (fileName.Substring(fileName.LastIndexOf('.') + 1).ToString().Equals("aspx"))
{
return;
}
if (!fileName.Equals(string.Empty))
{
extensionName = fileName.Substring(fileName.LastIndexOf('.') + 1).ToString();
if (!extensionName.Equals(string.Empty))
{
string contentType = this.GetContentType(fileName);
if (contentType.Equals(string.Empty))
{
HttpContext.Current.Server.Transfer("NoHandler.aspx");
};
{
FileDataSource dataSource = new FileDataSource();
string paritionKey = this.GetPartitionName(extensionName);
if (String.IsNullOrEmpty(paritionKey))
{
HttpContext.Current.Server.Transfer("NoHandler.aspx");
}
FileEntity entity = dataSource.GetEntitiesByName(paritionKey, "Files/" + fileName);
if (entity != null)
HttpContext.Current.Response.Redirect(entity.FileUrl);
else
HttpContext.Current.Server.Transfer("NoResources.aspx");
}
}
}
}
/// <summary>
/// Get file's Content-Type.
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public string GetContentType(string filename)
{
string res = string.Empty;
switch (filename.Substring(filename.LastIndexOf('.') + 1).ToString().ToLower())
{
case "jpg":
res = "image/jpg";
break;
case "css":
res = "text/css";
break;
}
return res;
}
/// <summary>
/// Get file's partitionKey.
/// </summary>
/// <param name="extensionName"></param>
/// <returns></returns>
public string GetPartitionName(string extensionName)
{
string partitionName = string.Empty;
switch(extensionName)
{
case "jpg":
partitionName = "image";
break;
case "css":
partitionName = "css";
break;
}
return partitionName;
}
Step 4. Add a Default web page to show links of some examples, and add a FileUploadPage to upload some default resources to Storage for testing.
C#
Edit|Remove
csharp
public partial class FileUploadPage : System.Web.UI.Page
{
private static CloudStorageAccount account;
public List<FileEntity> files = new List<FileEntity>();
protected void Page_Load(object sender, EventArgs e)
{
account = CloudStorageAccount.FromConfigurationSetting("StorageConnections");
}
/// <summary>
/// Upload existing resources. ("Files" folder)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnUpload_Click(object sender, EventArgs e)
{
FileDataSource source = new FileDataSource();
List<string> nameList = new List<string>() { "Files/Microsoft.jpg", "Files/MSDN.jpg", "Files/Site.css" };
CloudBlobClient client = account.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference("container");
container.CreateIfNotExist();
var permission = container.GetPermissions();
permission.PublicAccess = BlobContainerPublicAccessType.Container;
container.SetPermissions(permission);
bool flag = false;
foreach (string name in nameList)
{
if (name.Substring(name.LastIndexOf('.') + 1).Equals("jpg") && File.Exists(Server.MapPath(name)))
{
if (!source.FileExists(name, "image"))
{
flag = true;
CloudBlob blob = container.GetBlobReference(name);
blob.UploadFile(Server.MapPath(name));
FileEntity entity = new FileEntity("image");
entity.FileName = name;
entity.FileUrl = blob.Uri.ToString();
source.AddFile(entity);
lbContent.Text += String.Format("The image file {0} is uploaded successes.
", name);
}
}
else if (name.Substring(name.LastIndexOf('.') + 1).Equals("css") && File.Exists(Server.MapPath(name)))
{
if (!source.FileExists(name, "css"))
{
flag = true;
CloudBlob blob = container.GetBlobReference(name);
blob.UploadFile(Server.MapPath(name));
FileEntity entity = new FileEntity("css");
entity.FileName = name;
entity.FileUrl = blob.Uri.ToString();
source.AddFile(entity);
lbContent.Text += String.Format("The css file {0} is uploaded successes.
", name);
}
}
}
if (!flag)
{
lbContent.Text = "You had uploaded these resources";
}
}
protected void LinkButton1_Click(object sender, EventArgs e)
{
Response.Redirect("Default.aspx");
}
}
public partial class FileUploadPage : System.Web.UI.Page
{
private static CloudStorageAccount account;
public List<FileEntity> files = new List<FileEntity>();
protected void Page_Load(object sender, EventArgs e)
{
account = CloudStorageAccount.FromConfigurationSetting("StorageConnections");
}
/// <summary>
/// Upload existing resources. ("Files" folder)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnUpload_Click(object sender, EventArgs e)
{
FileDataSource source = new FileDataSource();
List<string> nameList = new List<string>() { "Files/Microsoft.jpg", "Files/MSDN.jpg", "Files/Site.css" };
CloudBlobClient client = account.CreateCloudBlobClient();
CloudBlobContainer container = client.GetContainerReference("container");
container.CreateIfNotExist();
var permission = container.GetPermissions();
permission.PublicAccess = BlobContainerPublicAccessType.Container;
container.SetPermissions(permission);
bool flag = false;
foreach (string name in nameList)
{
if (name.Substring(name.LastIndexOf('.') + 1).Equals("jpg") && File.Exists(Server.MapPath(name)))
{
if (!source.FileExists(name, "image"))
{
flag = true;
CloudBlob blob = container.GetBlobReference(name);
blob.UploadFile(Server.MapPath(name));
FileEntity entity = new FileEntity("image");
entity.FileName = name;
entity.FileUrl = blob.Uri.ToString();
source.AddFile(entity);
lbContent.Text += String.Format("The image file {0} is uploaded successes.
", name);
}
}
else if (name.Substring(name.LastIndexOf('.') + 1).Equals("css") && File.Exists(Server.MapPath(name)))
{
if (!source.FileExists(name, "css"))
{
flag = true;
CloudBlob blob = container.GetBlobReference(name);
blob.UploadFile(Server.MapPath(name));
FileEntity entity = new FileEntity("css");
entity.FileName = name;
entity.FileUrl = blob.Uri.ToString();
source.AddFile(entity);
lbContent.Text += String.Format("The css file {0} is uploaded successes.
", name);
}
}
}
if (!flag)
{
lbContent.Text = "You had uploaded these resources";
}
}
protected void LinkButton1_Click(object sender, EventArgs e)
{
Response.Redirect("Default.aspx");
}
}
Step 5. Please add your Windows Azure Storage account name and key in the Azure project. If you do not have one, use Windows Azure Storage Emulator for testing.
Step 6. Build the application and you can debug it.
一个使用微软Azure blob实现文件下载功能的实例-附带源文件的更多相关文章
- presto访问 Azure blob storage
当集群使用Azure Blog Storage时,prestoDB无法获取返回结果,在此记录下 如下,hive里面的两个表,一个使用的是本地的hdfs,一个是使用 azure blob storage ...
- 微软Azure云主机及blob存储的网络性能测试
http://www.cnblogs.com/sennly/p/4137024.html 微软Azure云主机及blob存储的网络性能测试 1. 测试目的 本次测试的目的在于对微软Azure的云主机. ...
- 阿里云ONS而微软Azure Service Bus体系结构和功能比较
阿里云ONS而微软Azure Service bus体系结构和功能比较 版权所有所有,转载请注明出处http://blog.csdn.net/yangzhenping.谢谢! 阿里云的开放消息服务: ...
- 微软开放技术发布开源 Jenkins 插件以将 Windows Azure Blob 服务用的开作存储库
发布于 2014-02-10 作者 陈 忠岳 持续集成 (CI) 的历史源远流长, 其宗旨在于软件团队在敏捷环境中不断将他们的工作整合为持续构建.管理 CI 进程的工具已存在一段时间.过去几年中 ...
- 使用 Azure Blob Stoage 实现一个静态文件服务器
什么是Azure Blob Stoage Azure Blob Stoage 是微软Azure的对象存储服务.国内的云一般叫OSS,是一种用来存储非结构化数据的服务,比如音频,视频,图片,文本等等.用 ...
- 微软Azure配置中心 App Configuration (二):Feature Flag 功能开关特性
写在前面 Web服务开发过程中我们经常有这样的需求: 某些功能我必须我修改了配置才启用,比如新用户注册送券等: 某个功能需到特定的时间才启用,过后就失效,比如春节活动等: 某些功能,我想先对10%的用 ...
- 【Azure 机器人】微软Azure Bot 编辑器系列(3) : 机器人对话流中加入帮助和取消按钮功能 (The Bot Framework Composer tutorials)
欢迎来到微软机器人编辑器使用教程,从这里开始,创建一个简单的机器人. 在该系列文章中,每一篇都将通过添加更多的功能来构建机器人.当完成教程中的全部内容后,你将成功的创建一个天气机器人(Weather ...
- 欢迎阅读daxnet的新博客:一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为"希赛网" ...
- 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为“希赛网”)个人空间发布过一些 ...
随机推荐
- vss的ss.ini丢失或损坏导致的vss无法登录错误
vss的ss.ini丢失或损坏导致的vss无法登录错误 Written in 2007-07-03 18:17 在vss使用过程中,不知道什么原因,会导至vss目录中的ss.ini文件损坏,此文件位于 ...
- RedHat6配置yum源 (32位)
由于 redhat的yum在线更新是收费的,如果没有注册的话不能使用, 如果要使用,需将redhat的yum卸载后,重启安装,再配置其他源,以下为详细过程: 1.删除redhat原有的yum rpm ...
- 基于SMB协议的共享文件读写 博客分类: Java
基于SMB协议的共享文件读写 博客分类: Java 一.SMB协议 SMB协议是基于TCP-NETBIOS下的,一般端口使用为139,445. 服务器信息块(SMB)协议是一种IBM协议,用于在计 ...
- JBPM4 常用表结构
JBPM4 常用表结构 第一部分:表结构说明 Jbpm4 共有18张表,如下,其中红色的表为经常使用的表 一:资源库与运行时表结构 1. JBPM4_DEPLOYMENT 流程定义表 2. J ...
- 语言基础:C#输入输出与数据类型及其转换
今天学习了C#的定义及特点,Visual Studio.Net的集成开发环境和C#语言基础. C#语言基础资料——输入输出与数据类型及其转换 函数的四要素:名称,输入,输出,加工 输出 Console ...
- weblogic11g 安装集群 —— win2003 系统、单台主机
weblogic11g 安装集群 —— win2003 系统.单台主机 注意:此为weblogic11g 在win2003系统下(一台主机)的安装集群,linux.hpux.aix及多个主机下原理一 ...
- ubuntu 乱码 改为英文
http://878045653.blog.51cto.com/2693110/735654 解决方法: 改成全英文环境来解决 方格 乱码 : 用vim配置语言环境变量 vim / etc/envir ...
- asp.net TreeView与XML配合使用v1.1
刚我在做Tree view 绑定时自己摸索了一下,网上有人说TreeView绑定数据源,用什么递归绑定啥的,我不想看了,就自己试着写了一个 我是这样做的,如果有什么问题请大神指导,我是菜鸟额.. 1: ...
- "hadoop namenode -format"命令的作用和影响的文件
在hadoop部署好了之后是不能马上应用的,而是对配置的文件系统进行格式化.这里的文件系统,在物理上还未存在,或者用网络磁盘来描述更加合适:还有格式化,并不是传统意义上的磁盘清理,而是一些清除与准备工 ...
- Java连接MySQL数据库及简单操作代码
1.Java连接MySQL数据库 Java连接MySql需要下载JDBC驱动MySQL-connector-java-5.0.5.zip(举例,现有新版本).然后将其解压缩到任一目录.我是解压到D盘, ...