05.05.2016, 23:16
|
Аспирант
|
|
Регистрация: 21.10.2014
Сообщений: 37
|
|
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()
});
Как с этим бороться?
Последний раз редактировалось Boogie1989, 05.05.2016 в 23:33.
|
|
07.05.2016, 08:13
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Что находится в request.body?
Вроде бы надо записать ответ дропбокса, почему request-то?
|
|
07.05.2016, 08:19
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Как-то так это делается:
const http = require("http");
http.request({
host: "hostname",
path: "/path/to/api"
}, (response) => {
let file = fs.createWriteStream('./file');
response.pipe(file);
});
|
|
08.05.2016, 00:54
|
Аспирант
|
|
Регистрация: 21.10.2014
Сообщений: 37
|
|
Сори, не Request a Response. В body находится картинка которую прислал дропбок в строковом формате. Как этот ответ записать в файл?
|
|
08.05.2016, 14:01
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
let file = fs.createWriteStream('./file');
response.pipe(file);
Пробовал?
|
|
08.05.2016, 17:45
|
Аспирант
|
|
Регистрация: 21.10.2014
Сообщений: 37
|
|
Нет. У меня не работает(.
На загрузку с дропбокса вот такая функция
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)
},
Текстовые файлы качает и записывает нормально, а вот с изображением как то не очень, такое впечатление что дроп отдает или не то что надо (в чём сомневаюсь, так как текст все таки приходит), или в каком то формате. Пробувал эту же картинку прочитать и записать в файл локально без скачивания, все работает.
|
|
09.05.2016, 06:55
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
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'));
|
|
10.05.2016, 19:50
|
Аспирант
|
|
Регистрация: 21.10.2014
Сообщений: 37
|
|
Извиняюсь за надоедливость, в Node я пока что новичок. Download функция у меня находится в модуле и должна только передавать данные, а записывать в файл уже в другом месте.
Повторюсь еще раз, с текстовыми файлами проблем нету, они нормально скачиваются с дропа и так же без проблем потом записываются, а вот картинки ни как
|
|
11.05.2016, 09:47
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Цитата:
|
Извиняюсь за надоедливость, в Node я пока что новичок.
|
Как бы форум для того и существует, чтобы с вопросами надоедать)
Не стесняйся, спрашивай больше, пиши подробней: чем больше информации, тем проще решить задачу.
Цитата:
|
Download функция у меня находится в модуле и должна только передавать данные, а записывать в файл уже в другом месте.
|
Ну так пусть download передает поток:
function download() {
// var args = ...
return request(args);
}
А в другом месте этот поток пайпится в файл:
download().pipe(fs.createWriteStream("./file"));
Просто потоки - это реально очень удобно, кода получается мало и многие проблемы решаются автоматически.
|
|
11.05.2016, 09:50
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Чтобы, всё же, сохранять изображения через fs.writeFile (но лучше делать не так, а через потоки, как я прежде показал), надо установить кодировку на двоичную:
fs.writeFile("./file", response.body, "binary", function(err) {
//...
});
И проследи, чтобы формат response.body тоже был двоичный. Если это какой-нибудь base64, то его надо сперва раскодировать.
|
|
|
|