【发布时间】:2021-12-08 14:53:26
【问题描述】:
参考1:https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob-from-url
参考2:Authorization of Azure Storage service REST API
我根据上面的参考2实现了容器列表作为Next.js(/pages/api/)中的后端服务器。我在 Reference2 中实现了响应状态===OK。我的目标是使用 tier===cool 复制一个 blob,然后使用 tier===archive 将其粘贴到另一个容器中,这样我就不必在下载时更改存档 blob 的访问层。
我完全按照参考 2 进行了以下更改:
- 将 strToSign 设置为(对此部分最不确定):
const strToSign= PUT\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:${strTime}\nx-ms-version:2020-10-02\n/${account}/\n${containerName}/${blobName}
-
将标题(按照参考1)设置为:
const putConfig = { method: 'PUT', headers: { 'Authorization': auth, 'x-ms-date': strTime, 'x-ms-version': "2020-10-02", 'x-ms-copy-source': blobUrl, 'x-ms-requires-sync':'true' }}
哪里(如参考文献1),
const blobUrl = `https://${account}.blob.core.windows.net/${containerName}/${blobName}`
-
fetch 是这样设置的:
fetch(
https://${account}.blob.core.windows.net/${containerName}/${blobName}, putConfig) .then( 结果 => console.log(results), res.end()) -
这是我得到的 console.log(results) 输出:
响应{ 大小:0, 超时:0, [符号(身体内部)]:{ 正文:直通{ _可读状态:[可读状态], _events:[对象:空原型], _eventsCount:2, _maxListeners:未定义, _writableState:[可写状态], allowHalfOpen:真, [符号(kCapture)]:假, [符号(kCallback)]:空 }, 不安:虚假, 错误:空 }, [符号(响应内部)]:{ url: 'https://.blob.core.windows.net//', 状态:403, statusText: '服务器未能验证请求。确保 Authorization 标头的值正确形成,包括签名。', headers: Headers { [Symbol(map)]: [Object: null prototype] }, 计数器:0 } }
不确定错误是什么 - 是否与在 azure 门户上的特定 blob(资源)上设置访问权限有关?你如何解决这个问题?
附言
参考3:Authentication Failed in REST api call to PUT Blob in Azure Storage [REST][Azure Blob]
我还尝试使用以下内容:
const strToSign = `PUT\n\n\n\n\n\n\n\n\n\n\n\nx-ms-blob-type:BlockBlob\nx-ms-date:${strTime}\nx-ms-version:2020-10-02\n/${account}/\n${containerName}/\n${blobName}`;
错误依旧。
【问题讨论】:
-
您不使用 SDK 有什么原因吗?
-
是的。我希望您在不更改其访问层的情况下下载存档的 Blob。如果 blob 位于存档层中,则不能将 blob 副本或来自 url 的 blob 副本与 sdk 一起使用。要重新水化存档的 blob,您需要使用 sdk 更改层,这意味着您会丢失存档的数据。如果您知道一种在不使用 sdk 更改其层的情况下复制 blob 的方法,请告诉我。欣赏!
-
简单的答案是你不能。为了读取存档的 blob,必须首先通过移动到热层或冷层来补充它。
标签: node.js azure rest copy azure-blob-storage