【问题标题】:Upload to Azure Blob Storage with Shared Access Key使用共享访问密钥上传到 Azure Blob 存储
【发布时间】:2013-06-19 21:23:51
【问题描述】:

UPD:这是我的implemented solution to this problem

我正在尝试通过 Azure.Storage 库(不是 REST API)上传到 Azure blob 存储并通过共享访问密钥进行身份验证。

我已经看到了这个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);
}

有:

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?

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

【问题讨论】:

    标签: c# azure azure-storage azure-blob-storage


    【解决方案1】:

    GetBlobReferenceFromServer 出现问题 - 我收到 404 错误 来自 Azure 存储。是的,blob 不存在,也没有 参考。所以给定 CloudBlobClient,我如何将文件上传到 斑点?

    要使 GetBlobReferenceFromServer 工作,blob 必须存在于 blob 存储中。这在您知道 blob 存在于存储中并且想要找出 blob 的类型 - Block BlobPage 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);
    }
    

    谈到共享访问签名功能,我不久前写了一篇关于此的博客文章:http://gauravmantri.com/2013/02/13/revisiting-windows-azure-shared-access-signature/。您可以将其称为史蒂夫博文的第 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/

    【讨论】:

    • 谢谢!你是明星!我错过了使用 SAS 创建容器对象。
    • 我发现 queryString 是 URL 编码的,而 blobContainerSasUri 不是,这导致 Substring 调用无法正常工作。将该行替换为string blobContainerUri = blobContainerSasUri.Split('?')[0];
    猜你喜欢
    • 2019-11-08
    • 2018-03-16
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    相关资源
    最近更新 更多