如何在Windows Azure平台上传图像:最佳方法

时间:2011-12-08 03:33:27

标签: asp.net-mvc-3 file-upload azure azure-storage azure-storage-blobs

我有一个带有图片上传的注册表单,当我在Windows Azure服务器上传我的包应用程序时它不起作用。

服务器中的图像地址如下所示:

F:\sitesroot\0\Uploads\Users\9259826_2121813246965_1294840438_2490950_6619588_n.jpg

如果我有这样的图像网址,那就是它的相对路径:

http://dealma.cloudapp.net/Uploads/Users/9259826_2121813246965_1294840438_2490950_6619588_n.jpg

我已经解决了这个问题。

我用来上传的当前代码是:

if (userImg != null && userImg.ContentLength > 0)
            {
                try
                {
                    var fileName = Url.Encode(userImg.FileName);
                    //no overwrite files
                    var pathToCheck = Server.MapPath("~/Uploads/Users/" + fileName);
                    var savePath = Server.MapPath("~/Uploads/Users/");
                    var tempfileName = fileName;
                    int counter = 2;

                    while (System.IO.File.Exists(pathToCheck))
                    {
                        tempfileName = counter.ToString() + fileName;
                        pathToCheck = savePath + tempfileName;
                        counter++;
                    }

                    fileName = tempfileName;

                    var finalImg = Path.Combine(savePath, fileName);
                    userImg.SaveAs(finalImg);

                    //Img name
                    userSet.Picture = finalImg;
                    userSet.Thumbnail = finalImg;
                }
                catch (Exception ex)
                {
                    Response.Write("Não foi possível fazer upload do arquivo: " + ex.Message);
                }
            }

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:6)

正如乌鸦所说,你正在写信给本地存储"它是易失性的,不会在虚拟机的多个实例之间共享。

Blob存储允许您存储任意文件,图像等。每个项目都存储在自己的blob中。你也有一个"容器"的概念。 - 将其视为顶级目录文件夹。没有嵌套容器,但您可以使用名称中的路径字符来模拟它们(现在跳过此处,因为您需要快速解决方案)。

如果您下载Windows Azure Platform Training Kit并查看实验室"云服务简介",它会显示一个留言簿应用程序,其中照片会上传到blob存储。您将看到如何设置存储帐户,以及编写代码以将文件推送到blob而不是本地文件系统。这是样本中的一个片段:

初始化blob客户端,并设置容器来存储文件:

var storageAccount = 
  CloudStorageAccount.FromConfigurationSetting("DataConnectionString");

// create blob container for images
blobStorage = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobStorage.GetContainerReference("uploads");
container.CreateIfNotExist();

现在,在您的上传处理程序中,您将写入blob而不是本地文件系统:

 string uniqueBlobName = string.Format("uploads/image_{0}{1}",
   Guid.NewGuid(), Path.GetExtension(UserImg.FileName));
 CloudBlockBlob blob = blobStorage.GetBlockBlobReference(uniqueBlobName);
 blob.Properties.ContentType = UserImg.PostedFile.ContentType;
 // note: there are several blob upload methods -
 // choose the best one that fits your app
 blob.UploadFromStream(UserImg.FileContent);

下载平台培训套件后,您将看到完整的工作示例。

答案 1 :(得分:1)

您正尝试将图像保存到处理请求的Web角色所在的虚拟机。

您的应用程序中可能有多个Web角色实例。因此,文件保存在一台计算机上,但下一个请求由另一个没有此文件的Web角色和虚拟机提供。

因此,好主意是将需要从任何Web角色访问的所有数据保存到blob。如果您有一些静态数据,则可以将此数据放入包含Web角色的包中。所有其他数据应该驻留在blob中。

如果您不想修改应用程序的代码,可以将blob存储的一部分映射为另一个硬盘驱动器到Web角色的每个实例。在这种情况下,您只需要将接收到的数据写入此映射磁盘。可以从任何Web角色访问结果。