2017-06-12 3 views
0

Ich erstelle eine API, die autorisierte API-Aufrufe an Google APIs erstellt, speziell Drive für diese Frage. Meine API funktioniert einwandfrei und verwendet Google's Node API, um die Anfragen zu stellen. Wenn ich eine Anfrage an this Ressource abfeuern, erhalte ich die folgende Antwort zurück:Rendern von RAW-Bildbytes in Antworttext

{ 
"kind": "drive#file", 
"id": "...", 
"name": "bookmobile.jpg", 
"mimeType": "image/jpeg" 
} 

ich die obige Antwort verwenden Sie den MIME-Typ der Datei später angezeigt Ich bin zu bestimmen. Ich mache dann einen nachfolgenden Aufruf an denselben Endpunkt, aber spezifiziere alt=media als eine Option zum Herunterladen der Datei wie in Google's Guide spezifiziert. Wenn ich console.log oder res.send() die Antwort, erhalte ich die folgende Ausgabe:

image bytes

Was wir ist das rohe Bild Bytes aus dem API-Aufruf sehen. Wie rende ich diese Bytes zum Antwortkörper richtig? Mein Code ist wie folgt:

// DriveController.show 
exports.show = async ({ query, params }, res) => { 
    if (query.alt && query.alt.toLowerCase().trim() === 'media') { 
    // Set to JSON as we need to get the content type of the resource 
    query.alt = 'json' 

    // Get the Files Resource object 
    const options = createOptions(query, params.fileId) 
    const filesResource = await Promise.fromCallback(cb => files.get(options, cb)) 

    // Grab the raw image bytes 
    query.alt = 'media' 
    await createAPIRequest(createOptions(query, params.fileId), 'get', res, filesResource) 
    } else { 
    await createAPIRequest(createOptions(query, params.fileId), 'get', res) 
    } 
} 

async function createAPIRequest (options, method, res, filesResource = {}) { 
    try { 
    const response = await Promise.fromCallback(cb => files[method](options, cb)) 
    if (filesResource.hasOwnProperty('mimeType')) { 
     // Render file resource to body here 
    } else { 
     res.json(response) 
    } 
    } catch (error) { 
    res.json(error) 
    } 
} 

Suche durch alle verschiedenen Antworten hier scheinen auf folgendes hinweisen:

res.type(filesResource.mimeType) 
const image = Buffer.from(response, 'binary') 
fs.createReadStream(image).pipe(res) 

Aber das tötet meine Express-App mit dem folgenden Fehler:

Error: Path must be a string without null bytes

Wie würde ich diese RAW-Bild-Bytes richtig in den Antworttext rendern?

+0

Statt 'fs.createReadStream', nur tun' res.send (Bild) ', oder noch besser,' res.end (Bild) ' . –

+0

@JulianGoacher Ich bekomme mit 'res.send' folgendes zurück: http://i.imgur.com/e0lNDfG.png Es sieht so aus als würde es rendern, aber ich bin mir nicht sicher. –

+0

Entweder res.end() nach dem Senden aufrufen, oder einfach 'res.end (image)' verwenden. –

Antwort

0

Der Google API-Client gibt standardmäßig binäre Daten als Zeichenfolge zurück, wodurch die Bilddaten beschädigt werden. (Das Thema wird in diesem Thread diskutiert: https://github.com/google/google-api-nodejs-client/issues/618). Um dies zu beheben, verwenden Sie die encoding: null Option, wenn die Dateiinhalte anfordert:

files[method](options, { encoding: null }, cb)) 
Verwandte Themen