Как загрузить изображение на платформу Windows Azure: лучший подход

У меня есть форма регистрации с загрузкой изображения, и она не работает, когда я загружаю свое пакетное приложение на свой сервер Windows Azure.

Адрес образа на сервере выглядит так:

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

Если бы у меня был такой URL-адрес изображения, с его относительным путем:

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);
                }
            }

Кто-нибудь знает, как решить эту проблему?


person Rubia Gardini    schedule 08.12.2011    source источник


Ответы (2)


Как заявил corvus, вы пишете в «локальное хранилище», которое является изменчивым и не используется несколькими экземплярами вашей виртуальной машины.

Хранилище BLOB-объектов позволяет хранить произвольные файлы, изображения и т. д. Каждый элемент хранится в собственном BLOB-объекте. У вас также есть понятие «контейнер» — думайте о нем как о папке каталога верхнего уровня. Вложенных контейнеров нет, но вы можете эмулировать их с помощью символов пути в имени (пока пропустите это, так как вам нужно быстрое решение).

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

Инициализируйте клиент BLOB-объектов и настройте контейнер для хранения файлов:

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

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

Теперь в обработчике загрузки вы должны писать в большой двоичный объект вместо локальной файловой системы:

 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);

Вы увидите полный рабочий образец, как только загрузите комплект для обучения платформе.

person David Makogon    schedule 08.12.2011
comment
эта лаборатория теперь, кажется, называется «Введение в облачные службы», если кто-то еще пытается ее найти. - person Mark Heath; 05.11.2012

Вы пытаетесь сохранить образ на виртуальной машине, где находится веб-роль, обрабатывающая ваш запрос.

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

Таким образом, хорошей идеей является сохранение всех данных, которые должны быть доступны из любой веб-роли, в больших двоичных объектах. Если у вас есть статические данные, вы можете поместить их в пакет с вашей веб-ролью. Все остальные данные должны находиться в больших двоичных объектах.

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

person corvus    schedule 08.12.2011
comment
Если у вас более одного экземпляра, вы не можете записывать из нескольких экземпляров на облачный диск, так что это нежизнеспособное решение. Прямая запись в большие двоичные объекты работает нормально. - person David Makogon; 08.12.2011