Как обработать изображение с помощью ImageResizer и загрузить его в хранилище Azure? - PullRequest
0 голосов
/ 02 июля 2018

Я использую пакет nuget ImageResizer в своем приложении MVC, чтобы изменить размер загруженного изображения и преобразовать его в JPG. Затем это изображение должно быть загружено в мою учетную запись хранения Azure. Я получаю сообщение об ошибке при попытке загрузить файл изображения:

Доступ к пути 'C: \ Program Files (x86) \ IIS Экспресс \ Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.jpg» отказано

Итак, я что-то неправильно написал, но хочу убедиться, что я все делаю правильно. Вот мой код:

CarController

public ActionResult CarImageUpload(HttpPostedFileBase CarImage, string id)
{
    //Connect to Azure
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("cardata_AzureStorageConnectionString"));

        //Process the Image
        try
        {
            //Create Blob Client
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            //Retrieve a reference to a container
            CloudBlobContainer blobContainer = blobClient.GetContainerReference("car-" + id);

            //Process Image
            ImageJob image = new ImageJob(CarImage, blobContainer + ".<ext>",
                new Instructions("width=500&format=jpg;mode=max"));

            //Create the container if it doesn't already exist
            try
            {

                blobContainer.CreateIfNotExists();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            try
            {                  
                image.Build();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            try
            {
                //Upload to Azure
                CloudBlockBlob blob = blobContainer.GetBlockBlobReference(CarImage.FileName);
                blob.UploadFromStream(CarImage.InputStream);
                CarImage.InputStream.Close();

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }           
        return RedirectToAction("Index");
    }

View

@(Html.Kendo().Upload()
.Name("CarImage")
.Multiple(false)
.Validation(validation => validation.AllowedExtensions(new string[] { ".gif", ".jpg", ".png" }))
.Events(e => e
    .Upload("onFileSync")
    .Remove("onFileSync"))
    .Async(a => a
        .Save("CarImageUpload", "Car")
        .Remove("CarImageRemove", "Car")
        .AutoUpload(true)))

Я думаю, что я связал это с поиском своего хранилища Azure на локальном диске, но я не уверен, как убедиться, что он выглядит как Azure. Может кто-нибудь помочь мне заставить это работать?

1 Ответ

0 голосов
/ 04 июля 2018

Проблема не связана с загрузкой в ​​хранилище Azure.

См. Это утверждение

 ImageJob image = new ImageJob(CarImage, blobContainer + ".<ext>",
            new Instructions("width=500&format=jpg;mode=max"));

Второй параметр ImageJob является местом назначения для создания изображения с измененным размером.

Таким образом, метод заключается в создании образа с именем blobContainer + ".<ext>", т.е. Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.jpg в рабочем каталоге IIS C:\Program Files (x86)\IIS Express.

Чтобы получить доступ к C:\Program Files (x86), нам нужно запустить IDE от имени администратора, иначе мы получим ошибку Access to the path ... is denied.

Вместо того, чтобы работать от имени администратора, вы можете записать свой измененный образ в MemoryStream.

var memoryStream = new MemoryStream();
ImageJob image = new ImageJob(CarImage, memoryStream,
            new Instructions("width=500&format=jpg;mode=max"));

Если я правильно понимаю, вы действительно хотите загрузить это изображение с измененным размером в хранилище Azure. Просто измените blob.UploadFromStream(CarImage.InputStream); на

memoryStream.Position = 0;
blob.UploadFromStream(memoryStream);
...