获取 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

将签名上传到 Azure Blob 存储

使用 Flutter (iOS/Android) 将图像上传到 Azure blob

如何将字节数组(即 byte[])保存到 Azure Blob 存储?

Blob 存储上的 Azure 触发器,从图像 (Blob) 中提取 EXIF (lat/long/direction...) 数据

如何从 azure blob 存储中获取 json 数据并使用 azure 数据工厂将其发送到 power apps dataverse