Загрузка изображения в хранилище 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);
Затем загрузка сработала и смогла получить данные.