Невозможно загрузить новый файл (‹4 МБ) в SharePoint (ms graph api)

Я пытаюсь загрузить вложение, полученное из Outlook, в папку в библиотеке документов SharePoint. Я слежу за документами: https://docs.microsoft.com/en-us/graph/api/driveitem-put-content?view=graph-rest-1.0&tabs=http#http-request-to-upload-a-new-file

fetch(`https://graph.microsoft.com/v1.0/sites/${siteId}/drive/items/${parentId}:/${attachment.name}:/content`, { 
      method: 'PUT', 
      mode: 'cors',
      headers: new Headers({
        'Authorization': `Bearer ${accesToken}`, 
        'Content-Type': 'text/plain'
      }),
      body: attachment.contentBytes
    })

Все, что я получаю, это ошибка с кодом: -1, Microsoft.SharePoint.Client.InvalidClientQueryException

Я попытался установить тело запроса на выборку как простую строку, такую ​​как «hello world», с целью тестирования, но все равно получаю ту же ошибку.

Любые идеи?

Спасибо заранее


[РЕДАКТИРОВАТЬ] Я подозреваю, что неправильно строю URL. Я не нашел документации по параметру:

  • {item-id} Я предполагаю, что этот идентификатор является атрибутом parentReference.siteId папки.

Это правильно?


person Andrés Biarge    schedule 20.01.2020    source источник
comment
Вы получили эту работу? Я всегда получаю ошибку Entity only allows writes with a JSON Content-Type header.   -  person Kebin Liu    schedule 27.02.2020
comment
Ага. Посмотри на мой ответ :)   -  person Andrés Biarge    schedule 02.03.2020


Ответы (1)


Хорошо, поэтому после некоторого тестирования с помощью Microsoft Graph Explorer я обнаружил, что самый простой способ загрузить файл в папку SharePoint, находящуюся внутри библиотеки документов (отличную от корневой библиотеки документов), - это работать с ним как с диском, используя конечная точка:

/drives/{drive-id}/items/{parent-id}:/{filename}:/content

(https://docs.microsoft.com/en-us/graph/api/driveitem-put-content?view=graph-rest-1.0&tabs=http#http-request-to-upload-a-new-file)

Чтобы получить идентификатор диска библиотеки документов, вы можете добавить к запросу графика параметр odata $ expand = drive, например:

`https://graph.microsoft.com/v1.0/sites/${siteId}/lists?$expand=drive`

Затем, наряду с другими атрибутами целевой библиотеки документов, вы найдете объект «диск», который содержит идентификатор диска, связанный с библиотекой документов, в которую вы хотите загрузить файл. Итак, вы должны сделать запрос PUT следующим образом:


fetch(`https://graph.microsoft.com/v1.0/drives/${libraryDriveId}/items/root:/${folderDisplayName}/${nameOfFile}:/content`, {
      method: 'PUT', 
      mode: 'cors',
      headers: new Headers({
        'Authorization': `Bearer ${accesToken}`, 
        'Content-Type': 'text/plain'
      }),
      body: BINARY_STREAM_OF_DATA
    }).then( (response) => {
      if (!response.ok) return response.json().then((json) => {throw json});
      return response.json();
    }).then( (json) => {
      //do whatever
    }).catch( (err) => {
      console.error(err);
    })

libraryDriv

  • libraryDriveId поступает из https://graph.microsoft.com/v1.0/sites/${siteId}/lists?$expand=drive запроса
  • /root:/${folderDisplayName} означает, что папка, на которую вы нацеливаетесь внутри библиотеки документов, находится в "root:" (корень библиотеки документов), за которым следует displayName папки, в которую вы хотите загрузить файл.
  • nameOfFile - это имя файла, который вы хотите загрузить
person Andrés Biarge    schedule 20.01.2020