Подтвердить что ты не робот

Загрузить изображение на веб-сайт 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"] указывает на абсолютный путь. Я верю, что это моя проблема. Я не могу понять, как переключить все это на относительный путь.

Спасибо!

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

//Edit; heres полный пример из моего блога (если блог умирает).  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;
         }
     }

Ответ 3

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

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

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

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

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

Ответ 4

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