azure-cosmosdb - 如何使用 REST API 从附件中读取媒体

标签 azure-cosmosdb

我创建了一个带有图像的附件:

{
"_rid": "xD4vALTE7QBAAwAAAAAAAA==",
"Attachments": [
    {
        "contentType": "image/jpeg",
        "id": "10b91d7d-2e5e-466e-a896-3ee54baff4dc",
        "media": "/media/xD4vALTE7QBAAwAAAAAAALobDgYB",
        "_rid": "xD4vALTE7QBAAwAAAAAAALobDgY=",
        "_self": "dbs/xD4vAA==/colls/xD4vALTE7QA=/docs/xD4vALTE7QBAAwAAAAAAAA==/attachments/xD4vALTE7QBAAwAAAAAAALobDgY=",
        "_etag": "\"00000d37-0000-0000-0000-5a09602a0000\"",
        "_ts": 1510563882
    }
],
"_count": 1

}

媒体对象的 url 是什么?

当我使用 Cosmos .NET SDK 方法 DocumentClient.ReadMediaAsync(string mediaLink) 时,其中 mediaLink/media/xD4vALTE7QBAAwAAAAAAALobDgY= 然后我可以获取媒体流并显示图像。但这仅在连接到 Cosmos Db 模拟器时有效,当在 Azure Cosmos DB 实例上执行相同操作时,我会收到此错误:

处理此请求时发生未知的服务器错误。 ActivityId:53508de6-2456-4213-947e-4361a8118574,Microsoft.Azure.Documents.Common/1.17.99.1,documentdb-dotnet-sdk/1.19.0主机/32位MicrosoftWindowsNT/6.2.9200.0

通过 Medial 上传创建附件是有效的。

我想尝试使用 Postman 查询 CosmosDB,但我无法找出获取 Media 对象的 url。

最佳答案

媒体对象的 URL 为:https://[YOUR-DOCDB-HOST]/media/xD4vALTE7QBAAwAAAAAAALobDgYB

我在 Postman 中将此称为 GET 请求,并使用以下预请求脚本:

// store our master key for documentdb
var mastKey = [YOUR-DOCUMENTDB-KEY-HERE];
console.log("mastKey = " + mastKey);

// store our date as RFC1123 format for the request
var today = new Date();
var UTCstring = today.toUTCString();
postman.setEnvironmentVariable("RFC1123time", UTCstring);

// define resourceId/Type now so we can assign based on the amount of levels
var resourceId = "[YOUR-RID-HERE]"; // _rid in attachment document
var resType = "media";

// assign our verb
var verb = request.method.toLowerCase();

// assign our RFC 1123 date
var date = UTCstring.toLowerCase();

// parse our master key out as base64 encoding
var key = CryptoJS.enc.Base64.parse(mastKey);
console.log("key = " + key);

// build up the request text for the signature so can sign it along with the key
var text = (verb || "").toLowerCase() + "\n" + 
               (resType || "").toLowerCase() + "\n" + 
               (resourceId || "").toLowerCase() + "\n" + 
               (date || "").toLowerCase() + "\n" + 
               "" + "\n";
console.log("text = " + text);

// create the signature from build up request text
var signature = CryptoJS.HmacSHA256(text, key);
console.log("sig = " + signature);

// back to base 64 bits
var base64Bits = CryptoJS.enc.Base64.stringify(signature);
console.log("base64bits = " + base64Bits);

// format our authentication token and URI encode it.
var MasterToken = "master";
var TokenVersion = "1.0";
auth = encodeURIComponent("type=" + MasterToken + "&ver=" + TokenVersion + "&sig=" + base64Bits);
console.log("auth = " + auth);

// set our auth token enviornmental variable.
postman.setEnvironmentVariable("authToken", auth);

有两个变量:[YOUR-DOCUMENTDB-KEY-HERE] 和 [YOUR-RID-HERE]。更重要的是,您需要首先查询附件元数据以获取 _rid 值,以便在请求媒体时在 token 中使用。

授权 header 中使用 authToken 和 RFC1123time postman 变量:

enter image description here

关于azure-cosmosdb - 如何使用 REST API 从附件中读取媒体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47267271/

相关文章:

c# - 如何使用查询从 cosmos db 获取最大 id 值

c# - DocumentDB 在提取大量记录时比 SQL 慢吗?

azure - DocumentDB 替换不起作用

azure - Azure 上的监控规模

c# - 使用 API 删除和重新创建数据库时,Azure Cosmos DB 上的存储设置不断从“无限制”更改为“固定”

python - .NET Azure Function App 使用 UpsertItemAsync 上传到 CosmosDB 的速度非常慢,尤其是与 Python 的 CosmosClient 相比

Azure Cosmos DB 分区键 - 主键是否可接受?

azure - Cosmos SQL 查询

azure - 使用 powershell 获取 Cosmos Db 容器吞吐量 Get-AzCosmosDBAcCount 吞吐量

odata - 带有 odata 的 CosmosDB 表 API 包含过滤器