Как преобразовать тип строки из ответа API в файл изображения - � � � � u0000u0010jfif u0000u0001 u0001 u0000u0000u0001 -
я использовал https://graph.microsoft.com/beta/me/photo/ $value API, чтобы получить изображение профиля пользователя outlook. Я получаю изображение при запуске вышеуказанного API в rest-клиенте. Тип содержимого API - это "image / jpg"
но, в узел.js, ответ API выглядит следующим образом:
����u0000u0010JFIFu0000u0001u0001u0000u0000u0001u0000u0001u0000u0000��u0000�u0000u0005u0005u0005u0005u0005u0005u0006u0006u0006u0006btbtbfu000bnnu000bfu0012ru000eru000eru0012u001bu0011u0014u0011u0011u0014u0011u001bu0018u001du0018u0016u0018u001du0018+"u001eu001e"+2*(*2<66<LHLdd�u
я использовал "fs" для создания файла изображения. Код выглядит следующим образом:
const options = {
url: "https://graph.microsoft.com/beta/me/photo/$value",
method: 'GET',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${locals.access_token}`,
'Content-type': 'image/jpg',
}
};
request(options, (err, res, body) => {
if(err){
reject(err);
}
console.log(res);
const fs = require('fs');
const data = new Buffer(body).toString("base64");
// const data = new Buffer(body);
fs.writeFileSync('profile.jpg', data, (err) => {
if (err) {
console.log("There was an error writing the image")
}
else {
console.log("The file is written successfully");
}
});
});
файл успешно записан, но .jpg
созданный файл изображения сломан. Я не могу открыть картинку.
Вывод файла изображения выглядит следующим образом:
77+977+977+977+9ABBKRklGAAEBAAABAAEAAO+/ve
2 ответов
вы можете сделать это, передав ответ таким образом,
request(options,(err,res,body)=>{
console.log('Done!');
}).pipe(fs.createWriteStream('./profile.jpg'));
причина этого в том, что по умолчанию,request
будем называть .toString()
по данным ответа. В случае двоичных данных, таких как RAW JPEG, это не то, что вы хотите.
это также объясняется в request
документация (хотя и смутно):
(Примечание: если вы ожидаете двоичные данные, вы должны установить
encoding: null
.)
что означает, что вы также можете использовать это:
const options = {
encoding : null,
url : "https://graph.microsoft.com/beta/me/photo/$value",
method : 'GET',
headers : {
'Accept' : 'application/json',
'Authorization' : `Bearer ${locals.access_token}`,
'Content-type' : 'image/jpg',
}
};
однако потоковая передача, вероятно, все еще лучшее решение, потому что оно не потребует сначала чтения всего ответа в память.