无法从 NodeJS 中的 Cloudinary 获取 image_id

Can't get image_id from Cloudinary in NodeJS

我正在使用 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>

在我的 routes/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
})

我猜 cloudinary 站点中的文档有误或已过时。尝试如下验证您的上传。它应该工作。

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")
  }
})

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

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

您可以在我们的示例项目中看到正确的行为 photo_album, specifically in 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});
  });
}

感谢您的关注!我们将很快更新我们的文档。

-- 多云