C# 使用共享访问密钥上载到Azure Blob存储

C# 使用共享访问密钥上载到Azure Blob存储,c#,azure,azure-storage,azure-storage-blobs,C#,Azure,Azure Storage,Azure Storage Blobs,UPD:这是我的 我正在尝试通过Azure.storage library(不是RESTAPI)上传到Azure blob存储,并通过共享访问密钥进行身份验证 我已经看到了这一点,但API自发布以来发生了变化,现在我无法得到相同的结果 以下是我所拥有的: var blobClient = new CloudBlobClient(new Uri(blobWithSas.BaseUri), new StorageCredentials(blobWithSas.Sas)); // here I r

UPD:这是我的

我正在尝试通过Azure.storage library(不是RESTAPI)上传到Azure blob存储,并通过共享访问密钥进行身份验证

我已经看到了这一点,但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);
}
具有:

blobWithSas.BaseUri
=
http://127.0.0.1:10000/devstoreaccount1/a6dc9274-6ce1-4095-be6b-e84d1012cb24
(Guid是在其他地方创建的已存在容器的名称。)

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、 我意识到这些东西有RESTAPI。但我以前使用过
Microsoft.WindowsAzure.Storage
library,如果可能的话,我希望避免使用REST服务

问题出现在GetBlobReferenceFromServer上-我得到404错误 来自Azure存储。是的,blob不存在,也不存在 参考资料。因此,给定CloudBlobClient,如何将文件上载到 斑点

要使
GetBlobReferenceFromServer
正常工作,blob必须存在于blob存储中
。当您知道blob存在于存储器中并且想要找出blob的类型时,这在场景中非常有用-
块blob
页面blob

如果要通过从本地计算机上载文件来创建块blob,可以执行以下操作:

    var blob = new CloudBlockBlob(new Uri(blobWithSas.AbsoluteUri), new StorageCredentials(blobWithSas.Sas));
using (var stream = new FileStream(fullFilePath, FileMode.Open))
{
    blob.UploadFromStream(stream);
}
谈到共享访问签名功能,不久前我写了一篇关于此的博客文章:。你可以称之为史蒂夫博客文章的第二版:)。我已经展示了使用RESTAPI和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);
    }
}
/// <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())
    {

    }
}
//
///上载blob容器中的blob,其中使用存储客户端库在blob容器上定义了SAS权限。
/// 
/// 
静态无效上载BlobWithStorageClientLibrarySApprovisionBlobContainer(字符串BlobContainerAsuri)
{
CloudBlobContainer blobContainer=新的CloudBlobContainer(新Uri(BlobContainerAsuri));
CloudBlockBlob blob=blobContainer.GetBlockBlobReference(“sample.txt”);
string sampleContent=“这是示例文本。”;
使用(MemoryStream ms=new MemoryStream(Encoding.UTF8.GetBytes(sampleContent)))
{
blob.UploadFromStream(毫秒);
}
}
使用RESTAPI:

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

    }
}
//
///上载blob容器中的blob,其中使用RESTAPI在blob容器上定义了SAS权限。
/// 
/// 
静态无效上载BlobWithRestapisAspermissionBlobContainer(字符串BlobContainerAsuri)
{
字符串blobName=“sample.txt”;
string sampleContent=“这是示例文本。”;
int contentLength=Encoding.UTF8.GetByteCount(sampleContent);
字符串queryString=(新Uri(blobContainerSasUri)).Query;
字符串blobContainerUri=BlobContainerAsuri.Split('?')[0];
string requestUri=string.Format(CultureInfo.InvariantCulture,“{0}/{1}{2}”、BlobContaineUri、blobName、queryString);
HttpWebRequest request=(HttpWebRequest)WebRequest.Create(requestUri);
request.Method=“PUT”;
添加(“x-ms-blob-type”、“BlockBlob”);
request.ContentLength=ContentLength;
使用(Stream requestStream=request.GetRequestStream())
{
Write(Encoding.UTF8.GetBytes(sampleContent),0,contentLength);
}
使用(HttpWebResponse resp=(HttpWebResponse)request.GetResponse())
{
}
}

您可能还会发现这篇博文很有用:

谢谢!你是个明星!我没有使用SAS创建容器对象。我发现queryString是URL编码的,而BlobContainerAsuri不是,这使得子字符串调用无法正常工作。将该行替换为
字符串blobContainerUri=blobContainerSasUri.Split('?')[0]