Node.js:文件上传API和JSON返回

时间:2017-02-13 20:05:32

标签: javascript json node.js watson

我对node.js完全不熟悉,所以我试图找到一种方法来创建一个图像文件上传API,它在进程完成后返回一个json。 我正在使用Watson Developer Cloud(视觉识别),它在完成处理任务后返回JSON。

我希望你有提示&关于如何完成这个项目的想法。我想过使用快递库?

这是我的代码,它现在处理本地图像并将JSON结果记录到控制台。我希望能够通过api上传图像并在完成此过程后返回JSON。

非常感谢!

处理图片的代码:

var watson = require('watson-developer-cloud') 
var fs = require('fs')  

//initialisng the service
var visual_recognition = watson.visual_recognition({ 
    api_key : '<Enter API Key here>',  
    version: 'v3',
    version_date: '2016-05-20' 
});   


var params = { 
    images_file: fs.createReadStream('./resources/image.jpg')
};  

visual_recognition.classify(params, function(err, res){ 
    if(err) 
        console.log(err); 
    else 
        console.log(JSON.stringify(res, null, 2)); 
});   

首先尝试上传服务器(感谢@Eduard提示):

var express = require('express')
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' }) 


var app = express()

app.post('/upload', upload.single('avatar'), function (req, res, next) {
    if(err){
        console.log("Error uploading file"); 
    }   
    console.log(req.file);  
    console.log(req.body); 

    res.status(204).end();
    console.log("Upload success"); 
}) 

app.listen(3000, function () {
  console.log('Upload Server listening on port 3000');
});

不幸的是,在使用这个简单的Python脚本上传图像时,会返回'ReferenceError:err未定义[..]':

import requests
url='http://localhost:3000/upload'
imageURL = 'ImageURL'

with open(imageURL, 'rb') as image:
    filename = image.name
    files = {'avatar': (image)}
    r = requests.request(method="POST", url=url, files=files)
    print(r.text);
    print(r.status_code)

旁注: 为什么我要使用Node.js服务器? 遗憾的是,我的硬件(机器人)不支持Watson-Developer-Cloud Python SDK,并且使用API​​端点从python直接上传会因硬件上的旧python版本而导致麻烦(SNI问题)

1 个答案:

答案 0 :(得分:2)

首先,您需要 ExpressJS 才能轻松捕获POST,其次,您应该使用 Multer ,因为它是最容易使用的在我看来提交上传。

var express = require('express')
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' })

var app = express()

app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // req.file is the `avatar` file
  // req.body will hold the text fields, if there were any
})

取自Multer repo的例子

您有关于在此处检查文件的更多信息:https://github.com/expressjs/multer