Загрузка изображения в хранилище BLOB-объектов Azure

Я знаю, что этот вопрос можно интерпретировать как дубликат, но я просто не могу заставить работать службу blop. Я следовал стандартному примеру на MSDN. Я реализовал в своем коде, но последовал примеру. Я могу заставить свой MobileService с помощью прилагаемого сценария в примере вставить BLOB-объект с открытыми свойствами. Затем я использую этот код для загрузки изображения в хранилище BLOB-объектов:

 BitmapImage bi = new BitmapImage();
 MemoryStream stream = new MemoryStream();
 if (bi != null)
 {
      WriteableBitmap bmp = new WriteableBitmap((BitmapSource)bi);
      bmp.SaveJpeg(stream, bmp.PixelWidth, bmp.PixelHeight, 0, 100);
 }

 if (!string.IsNullOrEmpty(uploadImage.SasQueryString))
 {
       // Get the URI generated that contains the SAS 
       // and extract the storage credentials.
       StorageCredentials cred = new StorageCredentials(uploadImage.SasQueryString);
       var imageUri = new Uri(uploadImage.ImageUri);

       // Instantiate a Blob store container based on the info in the returned item.
       CloudBlobContainer container = new CloudBlobContainer(
       new Uri(string.Format("https://{0}/{1}",
       imageUri.Host, uploadImage.ContainerName)), cred);

       // Upload the new image as a BLOB from the stream.
       CloudBlockBlob blobFromSASCredential = container.GetBlockBlobReference(uploadImage.ResourceName);
       await blobFromSASCredential.UploadFromStreamAsync(stream);//error!

       // When you request an SAS at the container-level instead of the blob-level,
       // you are able to upload multiple streams using the same container credentials.

       stream = null;
 }

Я получаю сообщение об ошибке в этом коде в точке, отмеченной ошибкой, со следующей ошибкой:

+       ex  {Microsoft.WindowsAzure.Storage.StorageException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.

Что я не понимаю, так как код, который возвращает строку из сценария:

// Generate the upload URL with SAS for the new image.
var sasQueryUrl = blobService.generateSharedAccessSignature(item.containerName, 
item.resourceName, sharedAccessPolicy);

// Set the query string.
item.sasQueryString = qs.stringify(sasQueryUrl.queryString);

// Set the full path on the new new item, 
// which is used for data binding on the client. 
item.imageUri = sasQueryUrl.baseUrl + sasQueryUrl.path;

Конечно, это также показывает, что я не совсем понимаю конструкцию хранилища BLOB-объектов. И поэтому любая помощь будет оценена.

Проработка комментариев Из кода сервера следует создать публичную заметку не менее 5 минут. И поэтому не будет проблемой. Мой серверный скрипт такой же, как ссылка. Но тиражируется здесь:

var azure = require('azure');
var qs = require('querystring');
var appSettings = require('mobileservice-config').appSettings;

function insert(item, user, request) {
// Get storage account settings from app settings. 
var accountName = appSettings.STORAGE_ACCOUNT_NAME;
var accountKey = appSettings.STORAGE_ACCOUNT_ACCESS_KEY;
var host = accountName + '.blob.core.windows.net';

if ((typeof item.containerName !== "undefined") && (
item.containerName !== null)) {
    // Set the BLOB store container name on the item, which must be lowercase.
    item.containerName = item.containerName.toLowerCase();

    // If it does not already exist, create the container 
    // with public read access for blobs.        
    var blobService = azure.createBlobService(accountName, accountKey, host);
    blobService.createContainerIfNotExists(item.containerName, {
        publicAccessLevel: 'blob'
    }, function(error) {
        if (!error) {

            // Provide write access to the container for the next 5 mins.        
            var sharedAccessPolicy = {
                AccessPolicy: {
                    Permissions: azure.Constants.BlobConstants.SharedAccessPermissions.WRITE,
                    Expiry: new Date(new Date().getTime() + 5 * 60 * 1000)
                }
            };

            // Generate the upload URL with SAS for the new image.
            var sasQueryUrl = 
            blobService.generateSharedAccessSignature(item.containerName, 
            item.resourceName, sharedAccessPolicy);

            // Set the query string.
            item.sasQueryString = qs.stringify(sasQueryUrl.queryString);

            // Set the full path on the new new item, 
            // which is used for data binding on the client. 
            item.imageUri = sasQueryUrl.baseUrl + sasQueryUrl.path;

        } else {
            console.error(error);
        }

        request.execute();
    });
} else {
    request.execute();
}
}

Идея с изображениями заключается в том, что другие пользователи приложения должны иметь к ним доступ. Насколько я понимаю, я сделал это публичным, но пишу только публично в течение 5 минут. URL-адрес большого двоичного объекта, который я сохраняю в таблице mobileservice, где пользователь должен пройти проверку подлинности, хотел бы обеспечить такую ​​же безопасность в хранилище. Но не знаете, достигнуто ли это? Я прошу прощения за все глупые вопросы, но я не смог решить это самостоятельно, поэтому я должен "казаться" глупым:)

1 ответ

Решение

Если кто-то в конечном итоге здесь нуждается в помощи. Проблема для меня была URI. Это должен был быть http, а не https. Тогда не было ошибок при загрузке.

Но отображение изображения даже на контрольном изображении с помощью панели инструментов не удалось. Проблема была в том, что я должен был установить поток в начале:

stream.Seek(0, SeekOrigin.Begin);

Затем загрузка сработала и смогла получить данные.

Другие вопросы по тегам