无法从NodeJS中的Cloudinary获取image_id

时间:2015-03-22 02:48:13

标签: javascript node.js express image-uploading cloudinary

我正在使用Node.js和Express。我只是实现Cloudinary从用户上传图像,并将图像ID存储到我的MySQL数据库。

我从Cloudinary的文档中尝试了本教程:http://cloudinary.com/documentation/node_image_upload。一切顺利,除了最后一步,我需要得到image_id

  var url = require('url')  
  var url_parts = url.parse(req.body.coverurl, true)
  console.log(url_parts) //DEBUG
  var query = url_parts.query
  console.log(query) //DEBUG

  var preloaded_file = new cloudinary.PreloadedFile(query.image_id)
  if (preloaded_file.is_valid()) {
    var image_id = preloaded_file.identifier()
    console.log("Img ID:" + image_id)
  } else {
    console.log("Invalid upload signature")
  }

req.body.coverurl类似于:image/upload/v1426989769/f08eodnwt5zqfwb2bgpd.png#f63f1fe77c7f536447e079f3dd10829b5a15d862 url_parts是:

{ protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: '#f63f1fe77c7f536447e079f3dd10829b5a15d862',
  search: '',
  query: {},
  pathname: 'image/upload/v1426989769/f08eodnwt5zqfwb2bgpd.png',
  path: 'image/upload/v1426989769/f08eodnwt5zqfwb2bgpd.png',
  href: 'image/upload/v1426989769/f08eodnwt5zqfwb2bgpd.png#f63f1fe77c7f536447e079f3dd10829b5a15d862' }

而且......变量query为空。 query.image_id无效,因此无法获取图片ID,也无法验证签名。

我不知道为什么Cloudinary会给出这个无效的回调字符串。或者我该如何解决这个问题。

感谢您的帮助。原谅我的英语不好:)

更新

我的submit_idea.hbs

<form action="/submit/idea" method="POST">
    {{{imgtag}}} <!-- this will render from: cloudinary.uploader.image_upload_tag('coverurl') -->
    <button type="submit">Save</button>
</form>
我的路线中的

/ submit.js

router.get('/submit/idea', function(req, res, next){
    // just render the submit_idea.hbs with some Cloudinary variable
})

router.post('/submit/idea', function(req, res, next){
  var url = require('url')  
  var url_parts = url.parse(req.body.coverurl, true)
  var query = url_parts.query

  var preloaded_file = new cloudinary.PreloadedFile(query.image_id)
  if (preloaded_file.is_valid()) {
    var image_id = preloaded_file.identifier()
    console.log("Img ID:" + image_id)
  } else {
    console.log("Invalid upload signature")
  }

  // add image_id to mysql
})

2 个答案:

答案 0 :(得分:0)

我猜云网站中的文档是错误的或过时的。尝试验证您的上传,如下所示。它应该工作。

router.post('/submit/idea', function(req, res, next){
  /*REMOVE THESE PARTS. I guess these are not needed any more. 
    var url = require('url')  
    var url_parts = url.parse(req.body.coverurl, true)
    var query = url_parts.query
   */
  //Directy pass coverurl to PreloadedFile method. 
  var preloaded_file = new cloudinary.PreloadedFile(req.body.coverurl)
  if (preloaded_file.is_valid()) {
    var image_id = preloaded_file.identifier()
    console.log("Img ID:" + image_id);
    // add image_id to mysql
  } else {
    console.log("Invalid upload signature")
  }
})

答案 1 :(得分:0)

Yalamber做对了。我们的文档已经过时了!

由于表单使用POST而非GET,因此image_id字段在请求正文中提供,而不是URL查询参数。

您可以在我们的示例项目photo_album中看到正确的行为,特别是在create_direct()中(以下简要介绍):

function create_direct(req,res){
  var photo = new Photo(req.body);
  var image = new cloudinary.PreloadedFile(req.body.image_id);
  if (image.is_valid()){
    photo.image = image.toJSON();
  }
  photo.save().then(function(photo){
    console.log('** photo saved');
  }).catch(function(err){
    console.dir(err);
  }).finally(function(){
    res.render('photos/create_direct',{photo:photo,upload:photo.image});
  });
}

感谢您的注意!我们会尽快更新我们的文档。

- Cloudinary