Ответ 1
Проблема возникает на GetBlobReferenceFromServer - я получаю ошибку 404 от Azure Storage. Да, blob не существует, и нет Справка. Поэтому, учитывая CloudBlobClient, как я могу загрузить файл в BLOb?
Чтобы работать GetBlobReferenceFromServer
, blob должен присутствовать в хранилище blob. Это полезно в сценарии, когда вы знаете, что blob существует в хранилище и хотел бы узнать тип blob - Block Blob
или Page Blob
.
Если вы хотите создать блок-блок, загрузив файл с локального компьютера, вы можете сделать что-то вроде:
var blob = new CloudBlockBlob(new Uri(blobWithSas.AbsoluteUri), new StorageCredentials(blobWithSas.Sas));
using (var stream = new FileStream(fullFilePath, FileMode.Open))
{
blob.UploadFromStream(stream);
}
Приступая к совместной работе с сигнатурой доступа, я написал сообщение в блоге не так давно: http://gauravmantri.com/2013/02/13/revisiting-windows-azure-shared-access-signature/
. Вы можете назвать его версией 2 сообщения в блоге Steve:). Я показал примеры загрузки капель с общей подписью доступа с использованием как REST API, так и Storage Client Library 2.0.
Некоторые примеры кода из сообщения в блоге:
Использование библиотеки клиентских хранилищ:
/// <summary>
/// Uploads a blob in a blob container where SAS permission is defined on a blob container using storage client library.
/// </summary>
/// <param name="blobContainerSasUri"></param>
static void UploadBlobWithStorageClientLibrarySasPermissionOnBlobContainer(string blobContainerSasUri)
{
CloudBlobContainer blobContainer = new CloudBlobContainer(new Uri(blobContainerSasUri));
CloudBlockBlob blob = blobContainer.GetBlockBlobReference("sample.txt");
string sampleContent = "This is sample text.";
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(sampleContent)))
{
blob.UploadFromStream(ms);
}
}
Использование REST API:
/// <summary>
/// Uploads a blob in a blob container where SAS permission is defined on a blob container using REST API.
/// </summary>
/// <param name="blobContainerSasUri"></param>
static void UploadBlobWithRestAPISasPermissionOnBlobContainer(string blobContainerSasUri)
{
string blobName = "sample.txt";
string sampleContent = "This is sample text.";
int contentLength = Encoding.UTF8.GetByteCount(sampleContent);
string queryString = (new Uri(blobContainerSasUri)).Query;
string blobContainerUri = blobContainerSasUri.Split('?')[0];
string requestUri = string.Format(CultureInfo.InvariantCulture, "{0}/{1}{2}", blobContainerUri, blobName, queryString);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri);
request.Method = "PUT";
request.Headers.Add("x-ms-blob-type", "BlockBlob");
request.ContentLength = contentLength;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(Encoding.UTF8.GetBytes(sampleContent), 0, contentLength);
}
using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
{
}
}
Вы также можете найти это сообщение в блоге полезным: http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/