【问题标题】:Saving file to blob storage and associated metadata to table storage using one HTTP Post使用一个 HTTP Post 将文件保存到 blob 存储和关联的元数据到表存储
【发布时间】:2013-07-09 11:49:27
【问题描述】:
我想将文件上传到 Azure Blob 存储并将与该文件相关的元数据保存到表存储。实现这一目标的最佳方法是什么? Blob 存储 URI 需要保存在表存储模型数据中,因此我需要先将文件上传到 Blob 存储,然后才能保存元数据。
在一个表单上执行此操作是否是一种好习惯?有没有人有任何示例或教程可以指向我
【问题讨论】:
标签:
http-post
azure-sql-database
azure-blob-storage
html.beginform
【解决方案1】:
首先,由于 URI 不同,处理 Azure blob 和表存储的 API 也不同,因此在技术上不可能实现这一点。
不过,您确实有一些选择。首先,blob API 允许将元数据与 blob 相关联。 Put Blob REST API 调用具有选项 x-ms-meta name:value。这样,您可以执行单个 HTTP 请求来存储 blob 内容和元数据。如果您想将元数据严格存储到表存储中并一次性完成,那么您可以通过您的网络服务器路由您的 HTTP 请求,将内容和元数据发布到服务器端应用程序,然后由服务器端应用程序处理存储到blob 和 table 存储相关内容。
【解决方案2】:
我通过将文件发布到 blob 存储并从同一页面上的表单集合中获取相关元数据来实现这一点。在我的 POST 中,我使用 IO steam 来读取文件和相关的元数据,如下所示:
[HttpPost]
public ActionResult NewContent(HttpPostedFileBase postedFile,FormCollection form)
{
if (postedFile != null)
{
HttpPostedFileBase postedFileCopy = postedFile;
postedFileCopy.InputStream.Position = 0;
Stream stream = postedFile.InputStream;
string[] name = form.GetValues("name");
string[] author = form.GetValues("author");
string[] description = form.GetValues("description");
DateTime uploaddate = form.GetValues("uploaddate");
DateTime expirydate = form.GetValues("expirydate");
string[] participationpoints = form.GetValues("participationpoints");
string[] contenttypeid = form.GetValues("contenttypeid");
try
{
avm.AddContent(postedFile, stream, name, author, description, uploaddate, expirydate, participationpoints, contenttypeid);
}
catch (Exception ex)
{
return RedirectToAction("Index", "Admin");
}
}
}
然后,在我的 AdminViewModel 中,我调用了一个方法,通过我的 dbcontext 保存了关联的元数据,因此更改被保存到 SQL 存储,同时文件也被写入了 blob 存储。