2013-06-23 3 views
12

UPD: Hier ist mein implemented solution to this problemHochladen zu Azure Blob Storage mit Shared Access Key

Ich versuche zu Azure Blob Speicher über Azure.Storage Bibliothek (nicht REST API) und die Authentifizierung über Shared Access Key hochladen .

Ich habe diese blog post gesehen, aber die API hat sich seit dem Post geändert und jetzt kann ich nicht das gleiche Ergebnis erhalten. Hier

ist, was ich habe:

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

Mit: (. Guid Name des Containers ist, bereits vorhanden sind, woanders geschaffen)

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 (auch an anderer Stelle im Code ausgegeben)

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

Der Blob existiert nicht, ich möchte eine neue Datei hochladen und einen Blob erstellen. Ich habe "Server" -Anwendung, die Zugriffsschlüssel zum Azure-Speicherkonto hält. Der Server würde SAS an Clients und Clients senden, die Dateien direkt an Azure hochladen. Also SAS wäre nur zu schreiben, keine Lesung und Clients erstellen Dateien, wo der Server ihnen sagt (Container, Ordnernamen)

Das Problem kommt auf GetBlobReferenceFromServer - ich bekomme 404 Fehler von Azure Storage. Ja, der Blob existiert nicht und es gibt keine Referenz. Wie kann ich also eine Datei in einen Blob hochladen, wenn ich den CloudBlobClient verwende?

p.s. Ich weiß, dass es REST-API für diese Dinge gibt. Aber ich habe Microsoft.WindowsAzure.Storage Bibliothek zuvor verwendet und möchte REST-Dienst wenn möglich vermeiden.

Antwort

14

Das Problem kommt auf GetBlobReferenceFromServer - Ich bekomme 404 Fehler von Azure Storage. Ja, der Blob existiert nicht und es gibt keine Referenz. Wie kann ich also eine Cloud-Datei in einen Blob hochladen?

Für GetBlobReferenceFromServer zu arbeiten, muss der Blob in dem Blob Speicher vorhanden sein. Dies ist in dem Szenario nützlich, in dem Sie wissen, dass der Blob im Speicher vorhanden ist und den Typ des Blobs ermitteln möchte - Block Blob oder Page Blob.

Wenn Sie einen Block Blob erstellt werden soll, indem Sie eine Datei aus dem lokalen Computer hochladen Sie so etwas wie tun könnte:

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

kommt zur gemeinsamen Zugriff Signaturfunktionalität, schrieb ich einen Blog-Post nicht allzu langer Zeit über dies: http://gauravmantri.com/2013/02/13/revisiting-windows-azure-shared-access-signature/. Du kannst es Version 2 von Steves Blogpost nennen :). Ich habe Beispiele für das Hochladen von Blobs mit gemeinsamer Zugriffssignatur unter Verwendung der REST-API und der Storage Client Library 2.0 gezeigt.

Einige Codebeispiele aus dem Blog-Post:

Verwenden von Speicher 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); 
    } 
} 

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

    } 
} 

Sie können auch dieses Blog-Post finden nützlich: http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/

+0

Danke! Du bist ein Star! Ich habe die Erstellung eines Containerobjekts mit SAS vermisst. – trailmax

+0

Ich fand, dass die Abfragezeichenfolge URL-codiert war und die BlobContainerSasUri nicht war, wodurch der Substring-Aufruf nicht ordnungsgemäß funktioniert. Ersetzen Sie diese Zeile durch 'string blobContainerUri = blobContainerSasUri.Split ('?') [0];' – tster