2013-06-23 135 views
12

UPD:这是我的implemented solution to this problem上传到Azure的Blob存储与共享访问密钥

我试图通过Azure.Storage库上传到Azure的Blob存储(未REST API),并通过共享访问密码验证。

我已经看到这blog post,但自发布后API已经改变,现在我无法得到相同的结果。

以下是我有:

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

有:(GUID是容器的名称,已经存在,创建别处)

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(也在代码中的其他位置发布)

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

该blob不存在,我想上传新文件并创建一个blob。我有“服务器”应用程序将访问密钥保存到Azure存储帐户。服务器将SAS发送给客户端,客户端将文件直接上传到Azure。因此,SAS将只写,没有阅读和客户端将创建文件在服务器告诉他们(容器,文件夹名称)

问题出现在GetBlobReferenceFromServer - 我从Azure存储获得404错误。是的,blob不存在,也没有参考。所以给了CloudBlobClient,我怎样才能将文件上传到blob?

p.s.我意识到有这些东西的REST API。但是我之前使用过Microsoft.WindowsAzure.Storage库,如果可能的话,我想避免使用REST服务。

回答

14

GetBlobReferenceFromServer出现问题 - 我从Azure存储获得404错误 。是的,blob不存在,并且没有 参考。所以给了CloudBlobClient,我怎样才能将文件上传到 blob?

对于GetBlobReferenceFromServer工作,团块必须存在于斑点存储。这在您知道存储区中存在blob并希望查明blob类型的场景中很有用 - Block BlobPage 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/。你可以称它为Steve的博客文章的第2版:)。我已经通过REST API和Storage Client Library 2.0展示了使用共享访问签名上传blob的示例。

从博客中的一些代码示例:

使用存储客户端库:

/// <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/

+0

谢谢!你是明星!我错过了用SAS创建容器对象。 – trailmax

+0

我发现queryString是URL编码的,而blobContainerSasUri不是,这使得Substring调用不能正常工作。将该行替换为'string blobContainerUri = blobContainerSasUri.Split('?')[0];' – tster

相关问题