Node.js 如何在没有express/multer的情况下处理节点中post请求中的图像数据?
我正在尝试向azure functions端点提交带有映像的POST请求。端点将要将映像上载到azure blob存储。一切都已连接,但我不确定如何处理要上载到blob存储帐户的表单编码图像数据。我希望避免添加express,并且正在寻找multer的替代品。我试着查阅文档,但它也使用express/multer 下面是我到目前为止对azure函数的了解。它目前可以将其上载到azure存储帐户,但数据不正确,因为我在尝试下载或查看它时无法显示数据Node.js 如何在没有express/multer的情况下处理节点中post请求中的图像数据?,node.js,azure,azure-functions,azure-blob-storage,Node.js,Azure,Azure Functions,Azure Blob Storage,我正在尝试向azure functions端点提交带有映像的POST请求。端点将要将映像上载到azure blob存储。一切都已连接,但我不确定如何处理要上载到blob存储帐户的表单编码图像数据。我希望避免添加express,并且正在寻找multer的替代品。我试着查阅文档,但它也使用express/multer 下面是我到目前为止对azure函数的了解。它目前可以将其上载到azure存储帐户,但数据不正确,因为我在尝试下载或查看它时无法显示数据 export const httpTrigger
export const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const storageConnectionString = config.storageConnectionString;
// Create the BlobServiceClient object which will be used to create a container client
const blobServiceClient = BlobServiceClient.fromConnectionString(storageConnectionString);
// Create a unique name for the container
const containerName = config.storageContainerName;
// Get a reference to a container
const containerClient = blobServiceClient.getContainerClient(containerName);
const blobName = context.bindingData.imageName;
// Get a block blob client
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
if (req.method === "POST")
{
const content = req.body;
const blobHeaders: BlobHTTPHeaders = {
blobContentType: "image/jpeg",
}
const options: BlockBlobUploadOptions = {blobHTTPHeaders: blobHeaders};
const uploadBlobResponse = await blockBlobClient.upload(content, content.length, options);
}
};
任何帮助都将不胜感激 正如wvilSnobu所说,你可以使用npm,这似乎是一个比强大更轻的替代品 请参阅以下代码:
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
const streamifier = require('streamifier');
const multipart = require('parse-multipart');
const azureStorage = require('azure-storage');
var bodyBuffer = Buffer.from(req.body);
var boundary = multipart.getBoundary(req.headers['content-type']);
var parts = multipart.Parse(bodyBuffer, boundary);
var filedata = parts[0].data; // Image buffer data
var filename = parts[0].filename;
var a=azureStorage.createBlobService('xxxx','xxxxxxxxxxxx');
try {
var b= a.createBlockBlobFromStream('container', filename, streamifier.createReadStream(new Buffer (filedata)), filedata.length,(err, result)=>{
if(err){
console.log("Image upload failed", err);
}
});
} catch (error) {
console.error(error);
}
};
我使用邮递员发送图像:
将图像上传到门户后,blob内容是application/octet stream
,我可以下载并成功查看它
有关更多详细信息,请参阅此
更新:
azure存储库和“新缓冲区”都已过期。请使用@azure/storage blob
参考代码
import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import { config } from "../cosmos/config";
import { BlobServiceClient, BlockBlobUploadStreamOptions } from "@azure/storage-blob";
const streamifier = require("streamifier");
const multipart = require("parse-multipart");
export const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const storageConnectionString = config.storageConnectionString;
// Create the BlobServiceClient object which will be used to create a container client
const blobServiceClient = BlobServiceClient.fromConnectionString(storageConnectionString);
// Create a unique name for the container
const containerName = config.storageContainerName;
// Get a reference to a container
const containerClient = blobServiceClient.getContainerClient(containerName);
// Gets the file name from the url, could be a bug if you want the filename from the file contents
const blobName = context.bindingData.imageName;
// Get a block blob client
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
if (req.method === "POST")
{
const bodyBuffer = Buffer.from(req.body);
const boundary = multipart.getBoundary(req.headers['content-type']);
const parts = multipart.Parse(bodyBuffer, boundary);
const filedata = parts[0].data;
const filename = parts[0].filename;
const options: BlockBlobUploadStreamOptions = {};
try
{
const result = await blockBlobClient.uploadStream(streamifier.createReadStream(Buffer.from(filedata)), filedata.length);
context.res = { status: 200 };
return;
}
catch(err)
{
console.log(err);
}
}
context.res = { status: 302, headers: { "location": blockBlobClient.url }, body: null};
};
从“@azure/functions”导入{AzureFunction,Context,HttpRequest};
从“./cosmos/config”导入{config};
从“@azure/storage blob”导入{BlobServiceClient,BlockBlobUploadStreamOptions};
常数流化器=需要(“流化器”);
const multipart=require(“解析多部分”);
export const httpTrigger:AzureFunction=async函数(context:context,req:HttpRequest):Promise{
const-storageConnectionString=config.storageConnectionString;
//创建BlobServiceClient对象,该对象将用于创建容器客户端
const blobServiceClient=blobServiceClient.fromConnectionString(storageConnectionString);
//为容器创建唯一的名称
const containerName=config.storageContainerName;
//获取对容器的引用
const containerClient=blobServiceClient.getContainerClient(containerName);
//从url获取文件名,如果要从文件内容获取文件名,则可能是一个错误
const blobName=context.bindingData.imageName;
//获取块blob客户端
const blockBlobClient=containerClient.getBlockBlobClient(blobName);
如果(请求方法==“POST”)
{
const bodyBuffer=缓冲区from(请求主体);
const boundary=multipart.getBoundary(请求头['content-type']);
const parts=multipart.Parse(bodyBuffer,boundary);
const filedata=parts[0]。数据;
常量文件名=部件[0]。文件名;
常量选项:BlockBlobUploadStreamOptions={};
尝试
{
const result=await blockBlobClient.uploadStream(streamizer.createReadStream(Buffer.from(filedata)),filedata.length);
context.res={status:200};
返回;
}
捕捉(错误)
{
控制台日志(err);
}
}
context.res={status:302,headers:{“location”:blockBlobClient.url},body:null};
};
正如wvilSnobu所说,您可以使用npm,它似乎是一种更轻量级的强大替代品
请参阅以下代码:
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
const streamifier = require('streamifier');
const multipart = require('parse-multipart');
const azureStorage = require('azure-storage');
var bodyBuffer = Buffer.from(req.body);
var boundary = multipart.getBoundary(req.headers['content-type']);
var parts = multipart.Parse(bodyBuffer, boundary);
var filedata = parts[0].data; // Image buffer data
var filename = parts[0].filename;
var a=azureStorage.createBlobService('xxxx','xxxxxxxxxxxx');
try {
var b= a.createBlockBlobFromStream('container', filename, streamifier.createReadStream(new Buffer (filedata)), filedata.length,(err, result)=>{
if(err){
console.log("Image upload failed", err);
}
});
} catch (error) {
console.error(error);
}
};
我使用邮递员发送图像:
将图像上传到门户后,blob内容是application/octet stream
,我可以下载并成功查看它
有关更多详细信息,请参阅此
更新:
azure存储库和“新缓冲区”都已过期。请使用@azure/storage blob
参考代码
import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import { config } from "../cosmos/config";
import { BlobServiceClient, BlockBlobUploadStreamOptions } from "@azure/storage-blob";
const streamifier = require("streamifier");
const multipart = require("parse-multipart");
export const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const storageConnectionString = config.storageConnectionString;
// Create the BlobServiceClient object which will be used to create a container client
const blobServiceClient = BlobServiceClient.fromConnectionString(storageConnectionString);
// Create a unique name for the container
const containerName = config.storageContainerName;
// Get a reference to a container
const containerClient = blobServiceClient.getContainerClient(containerName);
// Gets the file name from the url, could be a bug if you want the filename from the file contents
const blobName = context.bindingData.imageName;
// Get a block blob client
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
if (req.method === "POST")
{
const bodyBuffer = Buffer.from(req.body);
const boundary = multipart.getBoundary(req.headers['content-type']);
const parts = multipart.Parse(bodyBuffer, boundary);
const filedata = parts[0].data;
const filename = parts[0].filename;
const options: BlockBlobUploadStreamOptions = {};
try
{
const result = await blockBlobClient.uploadStream(streamifier.createReadStream(Buffer.from(filedata)), filedata.length);
context.res = { status: 200 };
return;
}
catch(err)
{
console.log(err);
}
}
context.res = { status: 302, headers: { "location": blockBlobClient.url }, body: null};
};
从“@azure/functions”导入{AzureFunction,Context,HttpRequest};
从“./cosmos/config”导入{config};
从“@azure/storage blob”导入{BlobServiceClient,BlockBlobUploadStreamOptions};
常数流化器=需要(“流化器”);
const multipart=require(“解析多部分”);
export const httpTrigger:AzureFunction=async函数(context:context,req:HttpRequest):Promise{
const-storageConnectionString=config.storageConnectionString;
//创建BlobServiceClient对象,该对象将用于创建容器客户端
const blobServiceClient=blobServiceClient.fromConnectionString(storageConnectionString);
//为容器创建唯一的名称
const containerName=config.storageContainerName;
//获取对容器的引用
const containerClient=blobServiceClient.getContainerClient(containerName);
//从url获取文件名,如果要从文件内容获取文件名,则可能是一个错误
const blobName=context.bindingData.imageName;
//获取块blob客户端
const blockBlobClient=containerClient.getBlockBlobClient(blobName);
如果(请求方法==“POST”)
{
const bodyBuffer=缓冲区from(请求主体);
const boundary=multipart.getBoundary(请求头['content-type']);
const parts=multipart.Parse(bodyBuffer,boundary);
const filedata=parts[0]。数据;
常量文件名=部件[0]。文件名;
常量选项:BlockBlobUploadStreamOptions={};
尝试
{
const result=await blockBlobClient.uploadStream(streamizer.createReadStream(Buffer.from(filedata)),filedata.length);
context.res={status:200};
返回;
}
捕捉(错误)
{
控制台日志(err);
}
}
context.res={status:302,headers:{“location”:blockBlobClient.url},body:null};
};
多亏了@Joey Cai和@evisnobu的回答,我才能够使用parse multipart和streamizer让它工作
import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import { config } from "../cosmos/config";
import { BlobServiceClient, BlockBlobUploadStreamOptions } from "@azure/storage-blob";
const streamifier = require("streamifier");
const multipart = require("parse-multipart");
export const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const storageConnectionString = config.storageConnectionString;
// Create the BlobServiceClient object which will be used to create a container client
const blobServiceClient = BlobServiceClient.fromConnectionString(storageConnectionString);
// Create a unique name for the container
const containerName = config.storageContainerName;
// Get a reference to a container
const containerClient = blobServiceClient.getContainerClient(containerName);
// Gets the file name from the url, could be a bug if you want the filename from the file contents
const blobName = context.bindingData.imageName;
// Get a block blob client
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
if (req.method === "POST")
{
const bodyBuffer = Buffer.from(req.body);
const boundary = multipart.getBoundary(req.headers['content-type']);
const parts = multipart.Parse(bodyBuffer, boundary);
const filedata = parts[0].data;
const filename = parts[0].filename;
const options: BlockBlobUploadStreamOptions = {};
try
{
const result = await blockBlobClient.uploadStream(streamifier.createReadStream(Buffer.from(filedata)), filedata.length);
context.res = { status: 200 };
return;
}
catch(err)
{
console.log(err);
}
}
context.res = { status: 302, headers: { "location": blockBlobClient.url }, body: null};
};
从“@azure/functions”导入{AzureFunction,Context,HttpRequest};
从“./cosmos/config”导入{config};
从“@azure/storage blob”导入{BlobServiceClient,BlockBlobUploadStreamOptions};
常数流化器=要求