javascript - 通过 api 上传照片时,Foursquare 丢失文件上传/InvalidPhotoFormat 错误

标签 javascript node.js request foursquare

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

相关文章:

javascript - 想要在 Div 中加载数据后执行脚本

javascript - 获取位于回调函数内的变量

javascript - NodeJS、Angular Seed、Gulp、Jasmine、Karma 问题

c++ - 使用 C++ 的简单 HTTP 请求

java - 读取Java中页面的源代码

Javascript - 自动启动/停止 setInterval

javascript - 如何运行在其他文件中定义的 get 和 post 等应用程序功能

javascript - 我在 nodejs 中有一个查询,想要从查询中返回 numOfComment 的值。但这是行不通的。请注意,这段代码外面有一个循环

node.js - 为什么我在 Web 服务器上收到代理错误,但在本地主机上却没有?

angularjs - AngularJs超时,响应时间长