Как преобразовать тип строки из ответа 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'));

https://www.npmjs.com/package/request#streaming

https://nodejs.org/api/fs.html#fs_class_fs_writestream


причина этого в том, что по умолчанию,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',
  }
};

однако потоковая передача, вероятно, все еще лучшее решение, потому что оно не потребует сначала чтения всего ответа в память.