在nodejs中使用azure blob存储触发器在另一个容器中压缩和写入文件

Posted

技术标签:

【中文标题】在nodejs中使用azure blob存储触发器在另一个容器中压缩和写入文件【英文标题】:compress and write a file in another container with azure blob storage trigger in nodejs 【发布时间】:2021-10-08 16:10:51 【问题描述】:

我必须进行 api 调用,将压缩文件作为输入传递。我在本地有一个工作示例,但我想将解决方案移动到云中。我正在考虑使用 azure blob 存储和 azure 函数触发器。我有以下适用于文件的代码,但我不知道如何对 nodejs 中的 azure blob 存储和 azure 函数执行相同操作

const zlib = require('zlib');
const fs = require('fs');

const def = zlib.createDeflate();

input = fs.createReadStream('claudio.json')
output = fs.createWriteStream('claudio-def.json')

input.pipe(def).pipe(output)

此代码将文件读取为流,压缩文件并将另一个文件写入流。

我想做的是在我将文件上传到 azure blob 存储容器中时读取文件,然后我想压缩它并保存在具有不同名称的不同容器中,然后进行 API 调用作为输入传递保存在另一个容器中的压缩文件

我尝试使用此代码压缩传入文件

const fs = require("fs");
const zlib = require('zlib');
const Readable, Writable = require('stream');
module.exports = async function (context, myBlob) 
    context.log("javascript blob trigger function processed blob \n Blob:", context.bindingData.blobTrigger, "\n Blob Size:", myBlob.length, "Bytes");
   // const fin = fs.createReadStream(context.bindingData.blobTrigger);
   const def = zlib.createDeflate();
   const s = Readable.from(myBlob.toString())
  context.log(myBlob);
  context.bindings.outputBlob = s.pipe(def)
;

这种方法的问题在于代码的最后一行

  context.bindings.outputBlob = s.pipe(def)

我没有压缩文件,如果我用这个

s.pipe(def).pipe(process.stdout)

我可以读取压缩文件

正如您在上面看到的,我也尝试使用 fs.createReadStream(context.bindingData.blobTrigger) 包含上传文件的名称和容器名称,但它不起作用

有什么想法吗? 谢谢

【问题讨论】:

【参考方案1】:

这就是解决办法

var input = context.bindings.myBlob;

var inputBuffer = Buffer.from(input);
var deflatedOutput = zlib.deflateSync(inputBuffer);

context.bindings.myOutputBlob = deflatedOutput;

https://docs.microsoft.com/en-us/answers/questions/500368/compress-and-write-a-file-in-another-container-wit.html

【讨论】:

以上是关于在nodejs中使用azure blob存储触发器在另一个容器中压缩和写入文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Nodejs 将文件从 Azure 存储 blob(容器)复制到 Azure 文件共享

如何脱机调试 Azure Blob 存储触发器?

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

(Azure 存储 - nodeJS)获取应用于 blob 容器和队列的 SAS 策略

如何基于 Azure 数据工厂中创建的 Blob 执行触发器?

Azure - 为存储容器中的每个新 blob 触发 Databricks 笔记本