如何读取 Azure 函数 HTTP 请求的参数并使用 blob 存储中的文件进行响应?

How to read parameters of Azure function HTTP request and respond with a file from blob storage?

我正在构建一个 Azure Function 应用程序,在尝试代理请求(用于数据捕获目的)并仍然响应请求的文件时遇到了一些问题。基本上我想要完成的是:

  1. 客户端通过 Azure Function 端点(而非其 blob 存储位置)上的 GET 参数请求文件
  2. 函数将一些元数据记录到 table 存储(例如 IP 地址、时间戳、文件名等)
  3. 函数在 blob 存储中找到所需的文件并将其转发给客户端,就像没有发生第 2 步一样

我尝试了一种使用 Q 的方法(概述 here),但没有成功,而且我无法缩小问题的范围(超出标准 500 错误)。

上面的教程基本上是这样的:

const rawFile = await q.nfcall(fs.readFile, blobUrl);

const fileBuffer = Buffer.from(rawFile, ‘base64’);

context.res = {
   status: 202,
   body: fileBuffer,
   headers: {
      "Content-Disposition": "attachment; examplefile.mp3;"
   }
};

context.done();

我遇到了一些困难,我正在努力寻找一个我认为是常见问题的解决方案(即简单地将下载元数据记录到 table)。我是 Azure 的新手,到目前为止我发现事情有点乏味......有没有简单的方法来做到这一点?

编辑: 根据我从 context.bindings.myFile.length 得到的回复,我 认为 我已经能够检索文件来自 blob 存储,但我还无法在响应中将其发回。我尝试了以下方法:

context.res = {
    status: 202,
    body: context.bindings.myFile,
    headers: {
        'Content-Type': 'audio/mpeg',
        'Content-Disposition': 'attachment;filename=' + fileName,
        'Content-Length': context.bindings.myFile.length
    }
};

编辑 2: 我认为这已经解决了很多 - 我忽略了下面答案的 HTTP 输入部分中的 methodsroute。看起来我能够根据 GET 请求动态检索 blob 并将它们用作输入,而且我也能够将它们发送回客户端。我的 HTTP 响应现在看起来像这样:

context.res = {
    status: 200,
    headers: {
        'Content-Length': context.bindings.myFile.length,
        'Content-Type': 'audio/mpeg'
    },
    body: context.bindings.myFile,
    isRaw: true
};

让我解释一下你的问题:

  • 您只想根据 http 请求检索 blob 存储对象。

我认为值得研究 bindings。它们简化了与其他 Azure 服务(存储帐户、服务总线、Twilio 和函数应用程序)的集成。

在您的情况下,它应该是 input binding for blob storage. As one way to achieve it you need to customize 您在 function.json 的 http 触发器部分中的路由,如下所示:file/{fileName}。然后在相同的 function.json.

中的输入绑定定义中使用 fileName

我觉得function.json应该是这样的:

{
    "bindings": [
    {
        "type": "httpTrigger",
        "name": "req",
        "direction": "in",
        "methods": [ "get" ],
        "route": "file/{fileName}"
    },
    {
      "name": "myFile",
      "type": "blob",
      "path": "your-container-name/{fileName}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
        "type": "http",
        "name": "res",
        "direction": "out"
    }
    ]
}

与你的index.js如下:

module.exports = function(context, req) {
    context.log('Node.js Queue trigger function processed', context.bindings.myFile);
    const fileToReturn = context.bindings.myFile;
    // you return it here with context.res = ...
    context.done();
};

您还肤浅地提到了不属于您的问题但被提及的日志记录。我建议查看 Azure Application Insights。它可能会达到目的。