maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании

Node.js POST запроса для загрузки файла вконтакт, через Open API?

Не могу понять, какие поля нужно отправить контакту, чтобы он мне вернул фотку. В данный момент мне возвращается ответ, но поле photo - пустое.
1) вконтакте про загрузку фото на стену пользователя здесь
2) попробовал разные модули для пост запроса (и http.request стандартный в том числе), но пока остановился на - superagent. Чуть ниже там идет документация по Attaching files.
3) мой кусочек кода
var request = require('superagent');
...
	request
		.post(url)
		.set('Content-Type', 'multipart/form-data')
		.set('Content-Length', Buffer.byteLength(dataCL,'utf8'))
		.attach('filename',memsPath+img+'.jpg')
		.field('photo',img+'.jpg')
		.end(callbackSA);


В переменной img - имя файла. В dataCL - длина, но пока не уверен что корректная.

Ответ от вк, примерно следующий:
status 200
'{"mid":10393237,"gid":0,"server":425122,"photo":"","hash":"e65dc1750b1b02ae815bca319b0884be"}'


До этого, когда я пытался делать без OpenAPI ответ был таким же, в случае неправильно приложенного файла, т.е. у формы стояло неправильное имя поля. Потом когда поставил форме правильное, пост запрос стал уходить нормально и в ответ получил уже данные по фото.

В чем может быть мой косяк:
1) неправильный Content-Length. Раскуриваю сейчас как сделать правильный.
2) неправильно передаю данные, которые ожидает вк.

По первому вопросу - могу и нагуглить. А по второму - уже кучу вкладок прочитал. Если кто-то знает, какой необходим набор полей для вк, что он от меня ждет в поле photo? нужен ли еще filename, и т.д.? Подскажите плиз, неважно на каком языке. Главное понять, что именно от меня ждут) но если будет примерчик на node.js - большое спасибо.
  • Вопрос задан
  • 4875 просмотров
Решения вопроса 1
maxfarseer
@maxfarseer Автор вопроса
https://maxpfrontend.ru, обучаю реакту и компании
madmages - ковыряние исходников в руки тебе...
а по факту - сам суперагент, внутри уже передает файл в поток, и пишет его, но увы не проставляет content-length, который так нужен вк апи.
Посмотрев варианты, реализовал запрос через node-curl

итоговое решение выглядит примерно так:
curl(url, {
            MULTIPART: [

                {name: 'file1', file: 'path/to/img.png', type: 'image/png'},
                {name: 'sumbit', contents: 'send'}
            ]
        }, function(e) {
            log.info(this.body);
            res.json(this.body);
        });
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
KingOfNothing
@KingOfNothing
А вот так не будет работать?
request
        .post(url)
        .set('Content-Type', 'multipart/form-data')
        .set('Content-Length', Buffer.byteLength(dataCL,'utf8'))
        .attach('photo',memsPath+img+'.jpg', img+'.jpg')
        .end(callbackSA);


И, вероятно, можно без этого:
.set('Content-Type', 'multipart/form-data')
        .set('Content-Length', Buffer.byteLength(dataCL,'utf8'))

То есть:
request
        .post(url)
        .attach('photo',memsPath+img+'.jpg', img+'.jpg')
        .end(callbackSA);
Ответ написан
madmages
@madmages
Человек прямоходящий
передавать надо сам файл а не ссылку на него. работа с потоками в руки тебе
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы