我正在使用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
})
答案 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