javascript - Hvordan udtrækker/parseer man det binære indhold fra et Multipart-svar i NodeJS?


Jeg vil udtrække det binære indhold fra et multipart-svar, som jeg har som følger -

Jeg har ikke adgang til nogen request-objekt (Express/NodeJS). Jeg har kun dette response-objekt, som jeg vil analysere og udtrække den binære del af.

REDIGER -

For at gøre tingene mere klare -

  1. Jeg har en endpoint (ikke en traditionel Express-app, men FaaS) - kaldet "/fileUpload"

  2. Denne endpoint accepterer alle slags forespørgsler - GET, POST, PUT (FaaS).

  3. Når jeg laver en POST/PUT-anmodning med en fil - testImage.PNG i formdataene, modtager jeg indholdet i anmodningsobjektet. FaaS-runtime leverer req-objektet som en parameter til en funktionshandler.

  4. Nu, når jeg printer - request.body af den indkommende POST-anmodning, får jeg indholdet som vist på billedet ovenfor.

  5. Hvis jeg forsøger at uploade dette binære indhold direkte til S3, fører det til ødelæggelse af billedet, hvilket jeg tror skyldes tilstedeværelsen af yderligere indhold i multipart-responsen som - Content-Disposition...

Hvad jeg gerne vil gøre, er at analysere det yderligere multipart-indhold som Content-Type headeren og multipart-grænsen osv., så jeg kun får billedets binære data.

Svar #1

For at udtrække det binære indhold skal vi fjerne/parse header- og grænsefladesektionerne af det. Der findes et bibliotek - parse-multipart - som gør det nemt at gøre.

Eksempel -

Forudsat at anmodningshovedet indeholder et content-type-hoved.

var multipart = require('parse-multipart');
// The following section is the express endpoint/ FaaS handler
    {

        let header = req.headers["content-type"]
        let boundary  = header.split(" ")[1]
        boundary = header.split("=")[1]
        let body = event.data;
        //console.log("Boundary - "+ boundary)
        let parts = multipart.Parse(body, boundary);
        for (var i = 0; i < parts.length; i++) {
            var part = parts[i];
            console.log(part)

            var params = {
                Bucket: s3bucket,
                Key: part.file,
                Body: part.data,
                ACL: 'public-read',
                Metadata: {
                    'Content-Type': part.type
                }
            };
            //Upload the data to aws
            const data = await s3.putObject(params).promise()


        }
        return parts

    }

Svar #2

Jeg kæmpede i mange dage med dette problem. Løsningen var i API GATE WAY > konfiguration > Binære typer tilføj multipart/form-data.