如何读取 Azure 函数 HTTP 请求的参数并使用 blob 存储中的文件进行响应?
How to read parameters of Azure function HTTP request and respond with a file from blob storage?
我正在构建一个 Azure Function 应用程序,在尝试代理请求(用于数据捕获目的)并仍然响应请求的文件时遇到了一些问题。基本上我想要完成的是:
- 客户端通过 Azure Function 端点(而非其 blob 存储位置)上的 GET 参数请求文件
- 函数将一些元数据记录到 table 存储(例如 IP 地址、时间戳、文件名等)
- 函数在 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 输入部分中的 methods
和 route
。看起来我能够根据 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。它可能会达到目的。
我正在构建一个 Azure Function 应用程序,在尝试代理请求(用于数据捕获目的)并仍然响应请求的文件时遇到了一些问题。基本上我想要完成的是:
- 客户端通过 Azure Function 端点(而非其 blob 存储位置)上的 GET 参数请求文件
- 函数将一些元数据记录到 table 存储(例如 IP 地址、时间戳、文件名等)
- 函数在 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 输入部分中的 methods
和 route
。看起来我能够根据 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。它可能会达到目的。