2016-11-18 7 views
1

Ich schreibe eine Express-App, wo ein Endpunkt ein Bild aufnimmt und ich dann dieses Bild an eine Drittanbieter-API senden würde. Ich habe multer verwendet, um das Image auf der Festplatte zu speichern, und ich habe den relativen Dateipfad zum Image, aber die API, die ich aufrufen möchte, benötigt das tatsächliche Image oder eine Image-URL. Das Problem ist, dass ich nur einen Zeichenfolgenwert übergebe, der den Dateipfad zum Bild enthält. Hier ist, was ich habe zur Zeit:Angesichts der lokalen relativen URL zu einem Bild, wie bekomme ich das tatsächliche Bild zu senden

var multer = require('multer') 
var storage = multer.diskStorage({ 
    destination: function(req, file, cb) { 
     cb(null, './uploads/'); 
    }, 
    filename: function(req, file, cb) { 
     cb(null, Date.now() + file.originalname); 
    } 
}); 
var upload = multer({ storage: storage }); 

Und ich brauche das Bild in diesem API-Aufruf hier zu nennen:

router.post('/images/tags/info/image', upload.single('fileName'), function(req, res, next) { 
    console.log(req.file.path); 
    var imageUrl = req.file.path; 
    app.models.predict('APP_KEY', imageUrl).then(
     function (response) { 
      var responseJson = JSON.stringify(response.data.outputs[0].data.concepts); 
      var data = collectTags(responseJson); 
      data.then(function(value) { 
       res.json(value); 
      }); 
     }, 
     function (err) { 
      console.log(err); 
     }); 
}); 

Als ich console.log(req.file.filePath), erhalte ich einen gültigen Dateipfad, aber ich brauche das eigentliche Bild in die app.models.predict(API_KEY, image)

+0

Was passiert, wenn Sie die '.path' entfernen und senden Sie einfach' req.file' –

+0

ich einen 400-Fehler erhalten mit 'badrequest' –

+0

' Daten: {status: {code: 11100, Beschreibung: ‚Bad Anfrageformat ', Details:' Invalid json path \ 'Eingaben [0] .data.image.destination \' in request. ' }}} ' –

Antwort

1

übergeben Sie können einfach das Bild aus dem Dateisystem lesen und es an die API senden.
z.B.

 const bitmap = await q.nfcall(fs.readFile,req.file.path); 
     //remove the temp image 
     fs.unlink(req.file.path);   
     const buffer = new Buffer(bitmap).toString('base64'); 
     app.models.predict('APP_KEY', buffer); 

Beispiel das Bild als Base64 Senden (unter Verwendung von Async/erwarten).

+0

'const bitmap = erwarten q.nfcall (fs.readFile, req.file.path);', es sagt, dass q ist eine unerwartete Kennung! –

+0

Ich benutze q Versprechen, für promisify, aber Sie können nur durch Ihre eigenen wie Bluebird oder es6 Versprechen ersetzen. Es ist nur mit asynchronem Code zu arbeiten. – Hosar

+0

Können Sie die vollständige Lösung schreiben? Ich habe einige Probleme mit dem 'q.nfcall' Teil –

Verwandte Themen