2013-06-23 25 views
12

UPD: Đây là tôi implemented solution to this problemUpload để Azure Blob lưu trữ với Chia sẻ kết nối chính

Tôi đang cố gắng để tải lên Azure lưu trữ blob qua thư viện Azure.Storage (không nghỉ ngơi API) và chứng thực qua Chia sẻ kết nối chính .

Tôi đã thấy số này blog post, nhưng API đã thay đổi kể từ bài đăng và bây giờ tôi không thể nhận được kết quả tương tự.

Dưới đây là những gì tôi có:

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

Có: (. Guid là tên của container, đã tồn tại, tạo ra ở một nơi khác)

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 (cũng được cấp một nơi khác trong mã)

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

Blob không tồn tại, tôi muốn tải lên tệp mới và tạo blob. Tôi có ứng dụng "Máy chủ" đang giữ Khóa truy cập vào Tài khoản lưu trữ Azure. Máy chủ sẽ phát hành SAS cho khách hàng và khách hàng tải tệp trực tiếp lên Azure. Vì vậy, SAS sẽ chỉ để viết, không đọc và khách hàng sẽ tạo ra các tập tin mà máy chủ nói với họ (container, tên thư mục)

Vấn đề xuất hiện trên GetBlobReferenceFromServer - Tôi nhận được lỗi 404 từ Azure lưu trữ. Có, blob không tồn tại và không có tham chiếu. Vì vậy, cho CloudBlobClient, làm thế nào tôi có thể tải lên một tập tin vào một blob?

p.s. Tôi nhận ra có REST API cho những thứ này. Nhưng trước đây tôi đã sử dụng thư viện Microsoft.WindowsAzure.Storage và muốn tránh dịch vụ REST nếu có thể.

Trả lời

14

Sự cố xảy ra trên GetBlobReferenceFromServer - Tôi gặp lỗi 404 từ Azure Storage. Có, đốm màu không tồn tại và không có tham chiếu . Vì vậy, cho CloudBlobClient, làm thế nào tôi có thể tải một tập tin lên một đốm màu ?

Đối GetBlobReferenceFromServer để làm việc, các blob phải có mặt trong lưu trữ blob. Điều này rất hữu ích trong kịch bản khi bạn biết rằng blob tồn tại trong bộ nhớ và muốn tìm ra loại blob - Block Blob hoặc Page Blob.

Nếu bạn muốn tạo một blob khối bằng cách tải lên một tập tin từ máy tính cục bộ bạn có thể làm một cái gì đó như:

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

Đến với chức năng truy cập chữ ký chia sẻ, tôi đã viết một bài đăng blog cách đây không quá lâu về điều này: http://gauravmantri.com/2013/02/13/revisiting-windows-azure-shared-access-signature/. Bạn có thể gọi nó là phiên bản 2 của bài đăng trên blog của Steve :). Tôi đã hiển thị các ví dụ về việc tải lên các đốm màu với chữ ký truy cập dùng chung, sử dụng cả API REST và Thư viện lưu trữ khách 2.0.

Một số mẫu mã từ các bài viết trên blog:

Sử dụng Thư viện lưu trữ Chủ đầu tư:

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

Sử dụng 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()) 
    { 

    } 
} 

Bạn cũng có thể tìm thấy bài viết trên blog này hữu ích: http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/

+0

Cảm ơn bạn! bạn là một ngôi sao! Tôi đã thiếu tạo đối tượng container với SAS. – trailmax

+0

Tôi thấy rằng queryString đã được mã hóa URL và blobContainerSasUri không làm cho cuộc gọi Substring không hoạt động chính xác. Thay thế dòng đó bằng 'string blobContainerUri = blobContainerSasUri.Split ('?') [0];' – tster

Các vấn đề liên quan