Файл API MS Graph заменяет элемент SharePoint ReactJS 404 не найден или проблема потока - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь использовать MS Graph API и ReactJS, чтобы загрузить файл из SharePoint, а затем заменить файл. Я управлял частью загрузки после использования значения @microsoft.graph.downloadUrl. Вот код, который возвращает мне документ XML из SharePoint.

export async function getDriveFileList(accessToken,siteId,driveId,fileName) {
  const client = getAuthenticatedClient(accessToken);
  //https://graph.microsoft.com/v1.0/sites/{site-id}/drives/{drive-id}/root:/{item-path}
  const files = await client
    .api('/sites/' + siteId + '/drives/' + driveId + '/root:/' + fileName)
    .select('id,name,webUrl,content.downloadUrl')
    .orderby('name')
    .get();
  //console.log(files['@microsoft.graph.downloadUrl']);
  return files;
}

При попытке загрузить этот же файл обратно я получаю сообщение об ошибке 404 itemNotFound. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. Несмотря на то, что в сообщении об ошибке говорится, что элемент не найден, я думаю, что MS Graph на самом деле может быть расстроен тем, как я отправляю файл XML обратно. Документация Microsoft по обновлению существующего файла гласит, что содержимое файла в потоке должно быть возвращено. Поскольку я загрузил файл XML в состояние, я не совсем уверен, как отправить его обратно. Самое близкое совпадение, которое я обнаружил, заключалось в преобразовании PDF-файла в BLOB-объект, поэтому я попробовал это.

export async function putDriveFile(accessToken,siteId,itemId,xmldoc) {
  const client = getAuthenticatedClient(accessToken);
  // /sites/{site-id}/drive/items/{item-id}/content
  let url = '/sites/' + siteId + '/drive/items/' + itemId + '/content';
  var convertedFile = null;
  try{
    convertedFile = new Blob(
        [xmldoc],
        {type: 'text/xml'});
  }
  catch(err) {
    console.log(err);
  }
  const file = await client
    .api(url)
    .put(convertedFile);
  console.log(file);
  return file;
}

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

1 Ответ

0 голосов
/ 17 апреля 2020

Правильный синтаксис для помещения (существующего) файла в библиотеку документов в SharePoint на самом деле PUT /sites/{site-id}/drive/items/{parent-id}:/{filename}:/content Я также обнаружил, что приведенный ниже код работает для получения документа XML и его преобразования в большой двоичный объект, который может быть загружен

  var xmlText = new XMLSerializer().serializeToString(this.state.xmlDoc);
  var blob = new Blob([xmlText], { type: "text/xml"});
  var file = new File([blob], this.props.location.state.fileName, {type: "text/xml",});
  var graphReturn = await putDriveFile(accessToken, this.props.location.state.driveId, this.state.fileId,file);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...