一个使用微软Azure blob实现文件下载功能的实例-附带源文件
2015-01-07 09:32
309 查看
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.
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.
源码下载
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.
源码下载
相关文章推荐
- 编写一个应用程序实现文件的复制。使用格式:java Copy 源文件目标文件,功能是将源文件的内容复制到目标文件。
- 一个使用Servlet文件实现文件下载的实例
- 一个使用Servlet文件实现文件下载的实例
- 使用普通的Servlet实现文件下载功能
- 使用IO技术,创建一个目录,然后复制一个文件到该目录!实现复制的功能。(在博客园上传的第一份代码)
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- 下面是一个使用FTPClient来实现的FTP上传和下载的功能
- 使用response实现文件下载功能
- 安卓使用WebView下载文件,安卓实现软件升级功能
- Asp.net实现MVC处理文件的上传下载功能实例教程
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- 一个使用URLDownloadToFile实现文件下载的类
- 一个使用URLDownloadToFile实现文件下载的类
- java resteasy restful webservice教程(六):实现文件下载功能实例文章来源:爱上123 原文地址:http://www.ishang123.com/jishubowen/
- (二)使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- 使用.net FtpWebRequest 实现FTP常用功能 上传 下载 获取文件列表 移动 切换目录 改名 .
- 使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- commons net jar包实现文件ftp上传和下载功能 (commons net ftp 使用1)
- 使用文件流下载文件功能实现 [原]
- java中struts2实现文件上传下载功能实例解析