2013-06-23 9 views
12

UPD: Ecco il mio implemented solution to this problemCarica per Azure Blob archiviazione con Shared Access Key

Sto cercando di caricare stoccaggio blob Azure tramite biblioteca Azure.Storage (non API REST) ​​e l'autenticazione tramite Shared Access Key .

Ho visto questo blog post, ma l'API è cambiata dal post e ora non riesco a ottenere lo stesso risultato.

Ecco quello che ho:

var blobClient = new CloudBlobClient(new Uri(blobWithSas.BaseUri), new StorageCredentials(blobWithSas.Sas)); 


// here I receive 404 error 
var blob = blobClient.GetBlobReferenceFromServer(new Uri(blobWithSas.AbsoluteUri)); 

using (var stream = new FileStream(fullFilePath, FileMode.Open)) 
{ 
    blob.UploadFromStream(stream); 
} 

aventi: (. Guid è il nome del contenitore, esistono già, ha creato da qualche altra parte)

blobWithSas.BaseUri = http://127.0.0.1:10000/devstoreaccount1/a6dc9274-6ce1-4095-be6b-e84d1012cb24

blobWithSas.Sas = ?sv=2012-02-12&se=2013-06-23T03%3A04%3A53Z&sr=b&sp=w&sig=NaMqgXRMXDFvLAp8LTskgplAKp%2B9LCZzq8WK9Zo35x8%3D (emesso anche da qualche altra parte nel codice)

blobWithSas.AbsoluteUri = http://127.0.0.1:10000/devstoreaccount1/a6dc9274-6ce1-4095-be6b-e84d1012cb24/foldername/filename.txt

Il blob non esiste, voglio caricare un nuovo file e creare un blob. Ho l'applicazione "Server" che contiene la chiave di accesso all'account di archiviazione di Azure. Il server invia SAS ai client e ai client carica i file direttamente in Azure. Quindi SAS dovrebbe solo scrivere, non leggere e i client creeranno i file in cui il server li dirà (contenitore, nomi di cartella)

Il problema si verifica GetBlobReferenceFromServer - Ottengo 404 errore da Archiviazione di Azure. Sì, il BLOB non esiste e non vi è alcun riferimento. Quindi, dato CloudBlobClient, come posso caricare un file in un BLOB?

p.s. Mi rendo conto che ci sono API REST per queste cose. Ma ho usato la libreria Microsoft.WindowsAzure.Storage prima e vorrei evitare il servizio REST, se possibile.

risposta

14

Il problema si presenta su GetBlobReferenceFromServer - Ottengo 404 l'errore da Archiviazione di Azure. Sì, il BLOB non esiste e non vi è alcun riferimento a . Quindi, dato CloudBlobClient, come posso caricare un file in un blob ?

Per GetBlobReferenceFromServer lavorare, il blob deve essere presente nella memoria blob. Questo è utile nello scenario quando si sa che il blob esiste nello spazio di archiviazione e si vorrebbe scoprire il tipo di blob - Block Blob o Page Blob.

Se si desidera creare un blob blocco caricando un file dal computer locale si potrebbe fare qualcosa di simile:

var blob = new CloudBlockBlob(new Uri(blobWithSas.AbsoluteUri), new StorageCredentials(blobWithSas.Sas)); 
using (var stream = new FileStream(fullFilePath, FileMode.Open)) 
{ 
    blob.UploadFromStream(stream); 
} 

Venendo alla funzionalità di firma accesso condiviso, ho scritto un post sul blog, non troppo tempo fa su questo: http://gauravmantri.com/2013/02/13/revisiting-windows-azure-shared-access-signature/. Puoi chiamarlo versione 2 del post sul blog di Steve :). Ho mostrato esempi di caricamento di BLOB con firma di accesso condiviso utilizzando sia REST API che Storage Client Library 2.0.

Alcuni esempi di codice dal post del blog:

Utilizzando bagagli Client Library:

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

Utilizzando 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()) 
    { 

    } 
} 

si può anche trovare questo post del blog utile: http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/

+0

Grazie! sei una stella! Mi mancava la creazione dell'oggetto contenitore con SAS. – trailmax

+0

Ho rilevato che queryString era codificato URL e che blobContainerSasUri non lo era, il che ha reso la chiamata di sottostringa non funzionante. Sostituisci la riga con 'string blobContainerUri = blobContainerSasUri.Split ('?') [0];' – tster