Node.js 如何在没有express/multer的情况下处理节点中post请求中的图像数据?

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

我正在尝试向azure functions端点提交带有映像的POST请求。端点将要将映像上载到azure blob存储。一切都已连接,但我不确定如何处理要上载到blob存储帐户的表单编码图像数据。我希望避免添加express,并且正在寻找multer的替代品。我试着查阅文档,但它也使用express/multer

下面是我到目前为止对azure函数的了解。它目前可以将其上载到azure存储帐户,但数据不正确,因为我在尝试下载或查看它时无法显示数据

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};
常数流化器=要求