Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   node download file from Dropbox (https://javascript.ru/forum/node-js-io-js/62882-node-download-file-dropbox.html)

Boogie1989 05.05.2016 23:16

node download file from Dropbox
 
Нужна помощь. Пользуясь подсказками "dropbox.com/developers" мне без особых проблем удалось закинуть файл на Дропбокс, а вот получить что то правильно не получается. То есть, ответ и файл я получаю, но записать в файл не могу. Пытаясь скачать картинку в ответ я получаю string, и пытаюсь сохранить эту картинку, но не получается
fs.writeFile('img.jpg',request.body,   (err) => {
  if (err) throw err;
  console.log('It\'s saved!');
  done()
});


Как с этим бороться?

Erolast 07.05.2016 08:13

Что находится в request.body?
Вроде бы надо записать ответ дропбокса, почему request-то?

Erolast 07.05.2016 08:19

Как-то так это делается:
const http = require("http");

http.request({
	host: "hostname",
	path: "/path/to/api"
}, (response) => {
	let file = fs.createWriteStream('./file');
	response.pipe(file);
});

Boogie1989 08.05.2016 00:54

Сори, не Request a Response. В body находится картинка которую прислал дропбок в строковом формате. Как этот ответ записать в файл?

Erolast 08.05.2016 14:01

let file = fs.createWriteStream('./file');
response.pipe(file);


Пробовал?

Boogie1989 08.05.2016 17:45

Нет. У меня не работает(.
На загрузку с дропбокса вот такая функция
download: function(path, cb) {
                    var args = {
                        "method": "POST",
                        "headers": {
                            "Authorization": "Bearer " + accessToken,
                            "Dropbox-API-Arg": JSON.stringify({
                                path: "/" + path
                            })
                        },
                        "url": 'https://content.dropboxapi.com/2/files/download',
                    }
                            return request(args, cb)
                },

Текстовые файлы качает и записывает нормально, а вот с изображением как то не очень, такое впечатление что дроп отдает или не то что надо (в чём сомневаюсь, так как текст все таки приходит), или в каком то формате. Пробувал эту же картинку прочитать и записать в файл локально без скачивания, все работает.

Erolast 09.05.2016 06:55

request - это модуль https://www.npmjs.com/package/request? Уточнять надо.

Если так, то там в первом же параграфе мануала описан потоковый интерфейс.
var args = {
    "method": "POST",
    "headers": {
        "Authorization": "Bearer " + accessToken,
        "Dropbox-API-Arg": JSON.stringify({
            path: "/" + path
        })
    },
    "url": 'https://content.dropboxapi.com/2/files/download',
};

request(args).pipe(fs.createWriteStream('./file'));

Boogie1989 10.05.2016 19:50

Извиняюсь за надоедливость, в Node я пока что новичок. Download функция у меня находится в модуле и должна только передавать данные, а записывать в файл уже в другом месте.
Повторюсь еще раз, с текстовыми файлами проблем нету, они нормально скачиваются с дропа и так же без проблем потом записываются, а вот картинки ни как

Erolast 11.05.2016 09:47

Цитата:

Извиняюсь за надоедливость, в Node я пока что новичок.
Как бы форум для того и существует, чтобы с вопросами надоедать)
Не стесняйся, спрашивай больше, пиши подробней: чем больше информации, тем проще решить задачу.

Цитата:

Download функция у меня находится в модуле и должна только передавать данные, а записывать в файл уже в другом месте.
Ну так пусть download передает поток:
function download() {
  // var args = ...
  return request(args);
}

А в другом месте этот поток пайпится в файл:
download().pipe(fs.createWriteStream("./file"));


Просто потоки - это реально очень удобно, кода получается мало и многие проблемы решаются автоматически.

Erolast 11.05.2016 09:50

Чтобы, всё же, сохранять изображения через fs.writeFile (но лучше делать не так, а через потоки, как я прежде показал), надо установить кодировку на двоичную:
fs.writeFile("./file", response.body, "binary", function(err) {
  //...
});


И проследи, чтобы формат response.body тоже был двоичный. Если это какой-нибудь base64, то его надо сперва раскодировать.


Часовой пояс GMT +3, время: 13:44.