3

我正在制作一个涉及用户上传图像的MVC Windows Azure网站。我想将图像存储在 blob 中。我搜索了教程,但大多数都是处理Webapps而不是 MVC 网站。

我发现的唯一有用的教程是:http: //www.codeproject.com/Articles/490178/How-to-Use-Azure-Blob-Storage-with-Azure-Web-Sites

我是整个 MVC/Windows Azure/Visual Studio 场景的新手,在第 7 步我必须连接到云存储帐户时感到困惑。

var storageAccount = CloudStorageAccount.Parse(
    ConfigurationManager.ConnectionStrings["StorageConnection"].ConnectionString);

我不知道我应该把那段代码放在哪里。

第 8 步中的代码相同:创建容器

blobStorage = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobStorage.GetContainerReference("productimages");
if (container.CreateIfNotExist())
{
    // configure container for public access
    var permissions = container.GetPermissions();
    permissions.PublicAccess = BlobContainerPublicAccessType.Container;
    container.SetPermissions(permissions);
}

第 9 步:将图像保存到 BLOB

string uniqueBlobName = string.Format("productimages/image_{0}{1}", 
   Guid.NewGuid().ToString(), Path.GetExtension(image.FileName));
CloudBlockBlob blob = blobStorage.GetBlockBlobReference(uniqueBlobName);
blob.Properties.ContentType = image.ContentType;
blob.UploadFromStream(image.InputStream);

任何帮助将不胜感激。也欢迎任何其他相关教程的链接。

非常感谢!

4

2 回答 2

2

我假设您已将Windows Azure Storage NuGet 包添加到您的 Web 应用项目?在您引用的参考文献中,这似乎并不明确,但如果您不这样做,您会看到一堆未解决的编译器错误。

就代码的去向而言,这完全取决于您。to 的赋值storageAccount就像设置一个数据库连接字符串;没有任何事情发生,因此您可以设置一次,并使其在整个应用程序中作为某个静态类实例的一部分可用。

在创建容器方面,只要您想存储数据,就可以这样做 - 认为它等同于在文件系统中创建文件夹或在关系数据库中创建表。如果您的应用程序始终将信息存储在同一个“硬编码”容器中,您可以提前在门户中设置容器,而不是在代码中创建。

将这样的代码放入其中可以提供一些弹性,以防容器通过某些外部进程被删除;就像使用 SQL Server 的应用程序可以在更新/检索之前检查 Employee 表是否存在一样,因为有可能(但不太可能)有人通过其他一些 SQL 工具删除了 Employee 表。

将图像保存到 blob 将直接放在负责启动该操作的任何控制器后面。这是你做“真正”工作的地方。您的示例中的代码专门引用了一个容器productimages,因此如果您想确定容器没有被删除(例如,通过门户网站),则可以在步骤 8 中的代码之前立即执行该代码。同样,这类似于每次访问传统客户端/服务器代码中的数据库表时检查其中的数据是否存在(我们大多数人可能认为这有点矫枉过正,我们会求助于异常处理来应对这种意外情况)。

于 2013-02-16T16:51:14.173 回答
0

老问题,但仍然可以帮助新手!

Azure Webapps 接受 MVC 应用程序。Azure 上的 Webapps 只是一个容器,我确信它可以采用不同类型的基于 ASP.NET 的应用程序、Forms 或 MVC、C# 或 VB.net。

假设您了解 MVC 应用程序的基础知识,您可以创建 Azure Webapp 并将其发布到那里。就这么直截了当。

这段代码:

var storageAccount = CloudStorageAccount.Parse(
    ConfigurationManager.ConnectionStrings["StorageConnection"].ConnectionString);

和这个:

blobStorage = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobStorage.GetContainerReference("productimages");
if (container.CreateIfNotExist())
{
    // configure container for public access
    var permissions = container.GetPermissions();
    permissions.PublicAccess = BlobContainerPublicAccessType.Container;
    container.SetPermissions(permissions);
}

可以进入一个专门用于 Blob 服务的新类,例如将其称为 blobServices.cs 并将其保存在 MVC 应用程序的根目录中,它看起来像这样:

    var storageAccount = CloudStorageAccount.Parse(
            ConfigurationManager.ConnectionStrings["StorageConnection"].ConnectionString);

    blobStorage = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobStorage.GetContainerReference("productimages");
    if (container.CreateIfNotExist())
    {
        // configure container for public access
        var permissions = container.GetPermissions();
        permissions.PublicAccess = BlobContainerPublicAccessType.Container;
        container.SetPermissions(permissions);
    }

这可能是最好的做法。从那里开始,在 MVC 应用程序的 Controller/s 中,您可以执行以下操作:

namespace blabla.cs
{

   public controller myBlobController
    {

      //instantiate the blob service
      BlobProfileImageServices _blobServices = new BlobProfileImageServices();

       public public ActionResult Index()
        {



            //call your blob storage service
            //and loop through each blob
            CloudBlobContainer blobContainer = _blobServices.GetCloudBlobContainer();
            List<string> blobs = new List<string>();
            foreach (var blobItem in blobContainer.ListBlobs())
            {
                blobs.Add(blobItem.Uri.ToString());

            }


      }

    }
}
于 2017-07-09T17:25:55.067 回答