我创建了一个带有图像的附件:
{
"_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 变量:
关于azure-cosmosdb - 如何使用 REST API 从附件中读取媒体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47267271/