获取 Azure Blob(图像)并 POST 到外部 API
Posted
技术标签:
【中文标题】获取 Azure Blob(图像)并 POST 到外部 API【英文标题】:Get an Azure Blob (image) and POST to an external API 【发布时间】:2021-05-29 21:52:19 【问题描述】:我有一个使用 Google Apps 脚本编写和运行的应用程序。它从 Google Drive 抓取图像,将其转换为 blob,然后通过请求正文将其发送到外部 API。
我现在正在将此应用程序转换为 nodejs 并使用 Azure 存储帐户来存储图像,但仍调用相同的外部 API。
在 Google Apps 脚本中,为了让 Google Drive 图像 blob 发送到外部 API,我使用 DriveApp.getFileById().getBlob()。这不是一个字符串,而是一个 blob 本身。
我在 node.js 中使用什么来存储 Azure Blob?
我曾尝试使用getBlobToText,但后来才明白这不是 API 想要的。它不想要一个字符串,而是 blob 本身。我也看过 getBlobToStream 和其他人,但他们似乎都没有真正得到 blob 本身。
我已经阅读了很多很多 *** 问答,以及许多其他文章和网站,但找不到任何关于使用下载的 Azure blob 发送到外部 API 的内容。
【问题讨论】:
【参考方案1】:在 Azure SDK 中,您可以将 blob 下载为 Stream
/string
。而且,这也是它在企业应用程序中的工作方式。你可以download blob如下:
// Get blob content from position 0 to the end
// In Node.js, get downloaded data by accessing downloadBlockBlobResponse.readableStreamBody
// In browsers, get downloaded data by accessing downloadBlockBlobResponse.blobBody
const downloadBlockBlobResponse = await blockBlobClient.download(0);
console.log('\nDownloaded blob content...');
console.log('\t', await streamToString(downloadBlockBlobResponse.readableStreamBody));
转成字符串的辅助函数:
// A helper function used to read a Node.js readable stream into a string
async function streamToString(readableStream)
return new Promise((resolve, reject) =>
const chunks = [];
readableStream.on("data", (data) =>
chunks.push(data.toString());
);
readableStream.on("end", () =>
resolve(chunks.join(""));
);
readableStream.on("error", reject);
);
然后您可以将此响应发送到您的外部 API。
我不确定您的要求,但这不是正确的方法,因为它会带来安全问题。您可以使用 RBAC 为您的 Azure Blob 存储授予外部 API 读取者角色,并让外部 API 直接从存储中读取 Blob。
【讨论】:
谢谢你,@singhh-msft!我让代码按照您上面的描述工作。根据我所看到的,它确实做了代码应该做的事情。但是,我正在调用的 API 似乎并不认为它是它正在寻找的正确格式。当我在使用 DriveApp.getFileById().getBlob() 之后在 Google Apps 脚本中执行 console.log 时,如上所述,它只是说“blob”。但是,当我对上面的 streamToString 的结果执行 console.log 时,它给了我页面和字符页面。因此,两者之间似乎存在差异,导致 API 不附加图片。想法? 如果您查看 Google Apps 脚本 getBlob() 描述 (developers.google.com/apps-script/reference/drive/file#getblob),它会说它返回“Blob - 数据作为 blob”。然后根据您在上面发布的链接(docs.microsoft.com/en-us/azure/storage/blobs/…),它说它“用于将 Node.js 可读流读入字符串”。我对 blob 的经验不足,无法确定它们是否存在差异,但它们似乎是根据 console.log 和 API 似乎无视我使用上述代码从 Azure 发送的内容。 这是我一年前在 *** 上遇到的非常相似的问题的 URL,当时我在 Google Apps 脚本中编写此代码并试图弄清楚如何将图像发送到 API:@ 987654324@。这是 API 文档,它显示了我正在谈论的“上传”字段(图像):projectbroadcast.com/apidoc/… 您可以更改外部 API 的代码来处理 Blob 的流/字符串吗? 很遗憾,外部 API 的代码不是我们的。这是第 3 方。所以,我们不能改变它。以上是关于获取 Azure Blob(图像)并 POST 到外部 API的主要内容,如果未能解决你的问题,请参考以下文章
如何将图像转换为 Base64 字符串,并转换回图像,保存到 azure blob
使用 Flutter (iOS/Android) 将图像上传到 Azure blob
如何将字节数组(即 byte[])保存到 Azure Blob 存储?
Blob 存储上的 Azure 触发器,从图像 (Blob) 中提取 EXIF (lat/long/direction...) 数据
如何从 azure blob 存储中获取 json 数据并使用 azure 数据工厂将其发送到 power apps dataverse