作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 api: https://api.foursquare.com/v2/photos/add 和以下 node.js 代码将照片添加到 foursquare 页面:
var accessToken = "myAccessToken";
var platformProfileId = "4squarePageId";
var b64content = "somebase64stringrepresentationofimage";
var url = "https://api.foursquare.com/v2/photos/add";
var formObj = {'oauth_token': accessToken, v: '20151009', 'pageId': platformProfileId, 'photo': b64content};
request({
url: url, //URL to hit
form: formObj, //form data
method: 'POST',
headers: { 'Content-Type': 'image/jpeg' }
}, function(error, response, body){
if(error) {
console.log(error);
return cb(error);
} else {
if(typeof body != 'object') {
body = JSON.parse(body);
}
console.log(body);
if(('meta' in body) && ('code' in body['meta']) && (body['meta']['code'] != 200)) {
return callback_inner("error");
}
var mediaIdStr = body['response']['id'];
return callback_inner(null, mediaIdStr);
}
});
我收到以下回复:
{ meta:
{ code: 400,
errorType: 'other',
errorDetail: 'Missing file upload',
requestId: '561fe6c1498e097824456e38' },
notifications: [ { type: 'notificationTray', item: [Object] } ],
response: {} }
谁能告诉我我哪里做错了?
更新:
var queryObj = {'oauth_token': accessToken, v: '20151009', 'pageId': platformProfileId};
request({
url: url, //URL to hit
qs: queryObj, //query obj
method: 'POST',
headers: { 'Content-Type': 'image/jpeg' },
body: b64content
}, function(error, response, body){
if(error) {
console.log(error);
return cb(error);
} else {
if(typeof body != 'object') {
body = JSON.parse(body);
}
console.log(body);
if(('meta' in body) && ('code' in body['meta']) && (body['meta']['code'] != 200)) {
return callback_inner("error");
}
var mediaIdStr = body['response']['id'];
return callback_inner(null, mediaIdStr);
}
});
尝试将图像作为帖子正文发送,但即便如此也无法正常工作。
更新 2:
var b64mediaFilesArr = results.C;
async.map(b64mediaFilesArr, function(b64content, callback_inner){
var imagename = new Date() + '.jpg';
var url = "https://api.foursquare.com/v2/photos/add";
var formObj = {
'oauth_token': accessToken,
'v': '20151009',
'pageId': platformProfileId,
'photo': {
value: b64content,
options: {
filename: imagename,
contentType: 'image/jpeg'
}
}
};
request({
url: url, //URL to hit
formData: formObj, //form data
method: 'POST',
headers: { 'Content-Type': 'image/jpeg' }
}, function(error, response, body){
if(error) {
console.log(error);
return cb(error);
} else {
if(typeof body != 'object') {
body = JSON.parse(body);
}
console.log(body);
if(('meta' in body) && ('code' in body['meta']) && (body['meta']['code'] != 200)) {
return callback_inner("error");
}
var mediaIdStr = body['response']['id'];
return callback_inner(null, mediaIdStr);
}
});
如果我使用上面的代码,那么响应会发生变化:
{ meta:
{ code: 400,
errorType: 'param_error',
errorDetail: 'InvalidPhotoFormat: Unable to determine photo type',
requestId: '56207798498ee45703ab6059' },
notifications: [ { type: 'notificationTray', item: [Object] } ],
response: {} }
看完之后我要疯了。谁能帮帮我?
解决方案
除了下面接受的答案外,我还解决了 base64 编码问题。对于那些在 Web 应用程序中使用 base64 编码图像数据的人,您需要将图像的原始二进制表示发送到 Foursquare。 This SO answer帮助我做到了这一点。 Convert Binary.toString('encode64') back to Binary
最佳答案
这些是对我有用的请求选项:
var options = {
'url': 'https://api.foursquare.com/v2/photos/add',
'qs': {
'v': '20161001',
'oauth_token': ACCESS_TOKEN,
'venueId': VENUE_ID
},
'formData': {
'file': {
'value': RAW_IMAGE_BUFFER,
'options': {
'filename': 'topsecret.jpg',
'contentType': 'image/jpg'
}
}
},
'json': true
};
然后调用:
request.post(options, function(error, response, body){})
关于javascript - 通过 api 上传照片时,Foursquare 丢失文件上传/InvalidPhotoFormat 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33155303/
我正在尝试使用 api: https://api.foursquare.com/v2/photos/add 和以下 node.js 代码将照片添加到 foursquare 页面:
我是一名优秀的程序员,十分优秀!