загрузить файл изображения в sharepoint через график API - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь загрузить файл изображения из моего приложения node.js на диск группы в Sharepoint.

Как гласит официальная документация , я делаю запрос следующим образом:

PUT /groups/{group-id}/drive/items/{parent-id}:/{filename}:/content

С двоичным изображением в теле: «Содержимое тела запроса должно быть двоичным потоком загружаемого файла.»

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

Вот мой код:

//i get my image from a URL first
https.get(url.parse(attachment.contentUrl), function (response) {
    var data = [];
    response.on('data', function (chunk) {
        data.push(chunk);
    });
    response.on('end', function () {
      if (response.statusCode === 200) {
        var buffer = Buffer.concat(data);
        //store my image in a local file to test if image is correct (which it is)
        fs.writeFile(localFileName, buffer, (fsError) => {
            //error handling
        });
        functions.uploadImageToSharepoint(session, localFileName, buffer, 
            function (err, body, res) {
                if (err) {
                    console.error(err);
                }else{
                    console.log('OK!');
                }
            });
      } else {
        //error handling
      }
    });
}).on('error', function (e) {
    console.log("error2: " + e);
});

//and the request to graph api
function uploadImageToSharepoint(session, fileName, data, callback) {
  var options = {
    url: 'https://graph.microsoft.com/v1.0/groups/xxxxxxx/drive/root:/yyyyyy/fileName.jpg:/content', 
    method: 'PUT',
    body: data,
    json: true,
    headers: {
      'Content-Type': 'image/jpg',
      Authorization: 'Bearer ' + session.userData.accessToken
    }    
  };

  request(options, function (err, res, body) {
    if (err) return callback(err, body, res);
    if (parseInt(res.statusCode / 100, 10) !== 2) {
        if (body.error) {
            return callback(new Error(res.statusCode + ': ' + (body.error.message || body.error)), body, res);
        }
        return callback(err, body, res);
    }
    callback(err, body ,res);   
  });  
}

1 Ответ

2 голосов
/ 01 мая 2019

Файл, скорее всего, поврежден из-за следующей опции для запроса:

var options = {
    json: true,   //<--setting this option sets body to JSON representation of value
    //another properties are omitted for clarity
  };

В этом случае request устанавливает тело в JSON-представление значения и добавляет accept заголовок к application/json для Upload конечная точка и двоичный файл повреждены.

Решением было бы исключить опцию json из запроса и использовать только правильные content-type:

var options = {
    url: '/me/drive/root:/filename.jpg:/content', 
    method: 'PUT',
    body: data,
    headers: {
      'Content-Type': 'image/jpg',
      Authorization: 'Bearer ' + accessToken
    }    
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...