Загрузить изображение на веб-сайт Windows Azure

У меня есть приложение ASP.NET MVC 4, которое я хочу развернуть в Windows Azure. Часть этого приложения включает в себя загрузку изображения. Когда изображение загружено, я хочу сохранить изображение в каталоге, расположенном по адресу /pictures/uploaded,

У меня вопрос: как загрузить изображение по относительному пути в моем приложении, размещенном в Windows Azure? До этого момента мое приложение размещалось на виртуальной машине. Я смог сделать вышеупомянутое, используя следующее:

string path = ConfigurationManager.AppSettings["rootWebDirectory"] + "/pictures/uploaded;

// Get the file path
if (Directory.Exists(path) == false)
  Directory.CreateDirectory(path);

string filePath = path + "/uploaded" + DateTime.UtcNow.Milliseconds + ".png";
filePath = filePath.Replace("/", "\\").Replace("\\\\", "\\");

// Write the picture to the file system
byte[] bytes = GetPictureBytes();
using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
{
  fileStream.Write(bytes, 0, bytes.Length);
  fileStream.Flush();
  fileStream.Close();
}

В настоящее время, ConfigurationManager.AppSettings["rootWebDirectory"] указывает на абсолютный путь. Я верю, что это где моя проблема. Я не могу понять, как переключить все это на относительный путь.

Спасибо!

4 ответа

Решение

Данные и изображения не предназначены для хранения в каталоге сайта. Вот почему существует хранилище BLOB-объектов Azure.

Azure работает, копируя веб-сайт в экземпляр, поэтому, если существует более одного экземпляра, загруженные изображения (которые хранятся локально для экземпляра) будут не синхронизированы, вы даже потеряете изображения, если возникнут конфликты.

Если вы действительно хотите это сделать, строка ниже даст вам то, что вы хотите:

string path = Server.MapPath("~/pictures/uploaded");

Вот мое простое описание того, как настроить это на лазурном. http://geekswithblogs.net/MagnusKarlsson/archive/2012/12/02/how-to-use-azure-storage-for-images.aspx

//Редактировать; Вот полный пример из моего блога (если блог умирает). yourViewName.cshtml

 @model List<string>  
 @{
     ViewBag.Title = "Index";
 }

 <h2>Index</h2>
 <form action="@Url.Action("Upload")" method="post" enctype="multipart/form-data">

     <label for="file">Filename:</label>
     <input type="file" name="file" id="file1" />
     <br />
     <label for="file">Filename:</label>
     <input type="file" name="file" id="file2" />
     <br />
     <label for="file">Filename:</label>
     <input type="file" name="file" id="file3" />
     <br />
     <label for="file">Filename:</label>
     <input type="file" name="file" id="file4" />
     <br />
     <input type="submit" value="Submit" />

 </form>

 @foreach (var item in Model) {

     <img src="@item" alt="Alternate text"/>
  }

Ваше действие контроллера

public ActionResult Upload(IEnumerable<HttpPostedFileBase> file)
         {
             BlobHandler bh = new BlobHandler("containername");
             bh.Upload(file);
             var blobUris=bh.GetBlobs();

             return RedirectToAction("Index",blobUris);
         }

Ваша модель

 public class BlobHandler
     {
         // Retrieve storage account from connection string.
         CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
         CloudConfigurationManager.GetSetting("StorageConnectionString"));

         private string imageDirecoryUrl; 

         /// <summary>
         /// Receives the users Id for where the pictures are and creates 
         /// a blob storage with that name if it does not exist.
         /// </summary>
         /// <param name="imageDirecoryUrl"></param>
         public BlobHandler(string imageDirecoryUrl)
         {
             this.imageDirecoryUrl = imageDirecoryUrl;
             // Create the blob client.
             CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

             // Retrieve a reference to a container. 
             CloudBlobContainer container = blobClient.GetContainerReference(imageDirecoryUrl);

             // Create the container if it doesn't already exist.
             container.CreateIfNotExists();

             //Make available to everyone
             container.SetPermissions(
                 new BlobContainerPermissions
                 {
                     PublicAccess = BlobContainerPublicAccessType.Blob
                 });
         }

         public void Upload(IEnumerable<HttpPostedFileBase> file)
         {
             // Create the blob client.
             CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

             // Retrieve a reference to a container. 
             CloudBlobContainer container = blobClient.GetContainerReference(imageDirecoryUrl);

             if (file != null)
             {
                 foreach (var f in file)
                 {
                     if (f != null)
                     {
                         CloudBlockBlob blockBlob = container.GetBlockBlobReference(f.FileName);
                         blockBlob.UploadFromStream(f.InputStream);
                     }
                 }
             }
         }

         public List<string> GetBlobs()
         {
             // Create the blob client. 
             CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

             // Retrieve reference to a previously created container.
             CloudBlobContainer container = blobClient.GetContainerReference(imageDirecoryUrl);

             List<string> blobs = new List<string>();

             // Loop over blobs within the container and output the URI to each of them
             foreach (var blobItem in container.ListBlobs())
                 blobs.Add(blobItem.Uri.ToString());

             return blobs;
         }
     }

Здесь уже есть несколько хороших ответов, которые точно скажут вам, как делать то, что вам нужно. Позвольте мне предложить альтернативу, если вы не возражаете.

Лично для решения таких проблем я обращаюсь к хранилищу BLOB-объектов Azure. Хранилище больших двоичных объектов - это чрезвычайно дешевый и быстрый способ хранения двоичных файлов (в структуре типа папок), полностью отделенных от виртуальной машины, на которой в настоящее время работает облачная служба.

Это даст вам некоторую дополнительную свободу при миграции или разработке с использованием существующего приложения, поскольку вам не нужно переносить свои загрузки вместе с каждым развертыванием. Файлы хранилищ больших двоичных объектов также трижды реплицируются в нескольких центрах обработки данных Azure без дополнительной платы и намного более отказоустойчивы, чем виртуальная машина развертывания.

Переход к хранилищу BLOB-объектов также позволит вам получить доступ к вашим файлам, когда ваш сайт отключен или виртуальная машина не работает.

Вы больше не работаете в области общих вычислений, где все ресурсы должны существовать на одном компьютере. Azure был создан для масштабируемости и разделения ресурсов. Хранилище BLOB-объектов было разработано специально для того, что вы пытаетесь сделать здесь.

string path = HostingEnvironment.MapPath(@"~/pictures/uploaded");
Другие вопросы по тегам