将数据和附件放入Cloudant DB IBM bluemix

时间:2016-04-30 00:28:06

标签: node.js ibm-cloud cloudant

我试图在我的附件中输入我的数据。我正在使用NodeJS

这是我的代码:

var date = new Date();

var data = {
  name : obj.name,
  serving : obj.serving,
  cuisine : obj.cuisine,
  uploadDate : date,
  ingredients : obj.ing,
  directions: obj.direction
}   //Assume that I read this from html form and it is OK

db.insert(data, function(err, body){
  if(!err){
    console.log(body);
    var id = body.id
    var rev = body.rev

    var headers = {
      'Content-Type': req.files.image.type
    };

    var dataString = '@' + req.files.image.path;

    var options = {
      url: 'https://username:password@username.bluemix.cloudant.com/db_name/' + id + '/' + req.files.image.name +'?' + 'rev=' + rev,
      method: 'PUT',
      headers : headers,
      body : dataString
    }

    console.log(options)

    function callback(error, response, body) {
      if (!error && response.statusCode == 200) {
        console.log(body);
      }
    }
    request(options, callback);

  }

});

我发送图像附件后得到201响应。但是在cloudant仪表板中,我看到上传图片的"length": 38是不可能的。

如果我尝试访问上传的图片,则会显示:

  

{"错误":" not_found","原因":"文档缺少附件"}。

我如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

看起来您正在上传图片的路径,而不是图片本身的内容:

var dataString = '@' + req.files.image.path;

这只会上传字符串' @ xyz'其中xyz是文件的路径。您需要上传图像的内容。有关更多信息,请参阅以下内容:

https://wiki.apache.org/couchdb/HTTP_Document_API#Attachments

我不确定如何从req.files获取上传文件的内容。我相信req.files不再适用于Express 4,所以我使用multer:

https://github.com/expressjs/multer

这是我将文件上传到上传到我的应用的Cloudant的方式:

<强>客户端

<form action="/processform" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
    <input type="submit" value="Submit">
</form>

Node.js路由

var multer  = require('multer');
...

var app = express();
...

var uploadStorage = multer.memoryStorage();
var upload = multer({storage: uploadStorage})
app.post('/processform', upload.single('myfile'), processForm);

注意:'myfile'是表单中文件输入类型的名称。

Node.js上传到Cloudant

function processForm() {

    // insert the document first...

    var url = cloudantService.config.url;
    url += "/mydatabase/" + doc.id;
    url += "/" + encodeURIComponent(req.file.originalname);
    url += "?rev=" + doc.rev;

    var headers = {
        'Content-Type': req.file.mimetype,
        'Content-Length': req.file.size
    };

    var requestOptions = {
        url: url,
        headers: headers,
        body: req.file.buffer
    };

    request.put(requestOptions, function(err, response, body) {
        if (err) {
            // handle error
        }
        else {
            // success
        }
    });

    ...
}