Вложение файлов в задачу Списка дел

С помощью Списка дел API в Microsoft Graph, вы можете вкладывать в задачи Списка дел файлы размером до 25 МБ. В зависимости от размера файла выберите один из двух способов вложения файла:

  • Чтобы объединить файлы любого размера, создайте сеанс загрузки и итеративно используйте PUT для загрузки диапазонов байтов файла, пока не загрузите весь файл. Заголовок в итоговом успешном отклике PUT включает URL-адрес с ИД вложения.
  • Если размер файла меньше 3 МБ, выполните однократное POST в свойстве навигации по вложениямзадачи Списка дел; посмотрите, как это сделать для задачи. Успешный отклик POST включает ИД вложенного файла.

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

Шаг 1. Создание сеанса отправки

Создайте сеанс отправки, чтобы вложить файл в задачу Списка дел. Укажите файл во входном параметре attachmentInfo.

После успешной операции возвращается HTTP 201 Created и новый экземпляр объекта uploadSession, содержащий непрозрачный URL-адрес, который можно использовать в последующих операциях PUT для отправки частей этого файла. Этот экземпляр uploadSession предоставляет временное место хранения, где байты файла сохраняются до отправки всего файла.

Объект uploadSession в ответе также включает свойство nextExpectedRanges, указывающее, что исходное начальное расположение загрузки должно быть байтом 0.

Разрешения

Для вызова этого API требуется одно из следующих разрешений. Дополнительные сведения, включая сведения о том, как выбрать разрешения, см. в статье Разрешения.

Тип разрешения Разрешения (в порядке повышения привилегий)
Делегированные (рабочая или учебная учетная запись) Tasks.ReadWrite
Делегированные (личная учетная запись Майкрософт) Tasks.ReadWrite
Для приложений Не поддерживается.

Пример: создание сеанса отправки для задачи Списка дел

Запрос

В следующем примере показан запрос на создание сеанса отправки.

POST https://graph.microsoft.com/beta/me/todo/lists/AAMDiFkfh=/tasks/AAMkADliMm=/attachments/createUploadSession
Content-Type: application/json

{
  "attachmentInfo": {
    "attachmentType": "file",
    "name": "flower",
    "size": 3483322
  }
}

Отклик

В следующем примере показан ресурс uploadSession, возвращенный для задачи в тексте отклика.

Примечание. Объект отклика, показанный здесь, может быть сокращен для удобочитаемости.

HTTP/1.1 200 OK
Content-Type: application/json

{
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#microsoft.graph.uploadSession",
    "uploadUrl": "https://graph.microsoft.com/beta/users/6f9a2a92-8527-4d64-837e-b5312852f36d/todo/lists/AAMDiFkfh=/tasks/AAMkADliMm=/attachmentSessions/AAMkADliMm=",
    "expirationDateTime": "2022-06-09T10:45:27.4324526Z",
    "nextExpectedRanges": [
        "0-"
    ]
}

Шаг 2. Отправка диапазона байтов файла с помощью сеанса отправки

Чтобы отправить файл или часть файла, добавьте /content к URL-адресу, возвращенный на шаге 1, в свойстве uploadUrl ресурса uploadSession и сделайте PUT запрос на добавленный URL-адрес. Можно отправить файл целиком или разделить файл на несколько диапазонов байтов. Каждый диапазон байтов должен быть менее 4 МБ.

Укажите заголовки и текст запроса, как описано в следующих разделах.

Заголовки запросов

Имя Тип Описание
Авторизация String Bearer {token}. Обязательно.
Content-Length Int32 Количество байтов, отправляемых в этой операции. Верхний предел числа байтов для каждой операции PUT составляет 4 МБ. Запрос завершится сбоем для всего, что превышает 4 МБ. Обязательный элемент.
Content-Range String Диапазон байтов файла, отправляемого в этой операции, начиная с байта 0, выраженный в формате bytes {start}-{end}/{total}. Обязательный элемент.
Content-Type String Тип MIME. Укажите application/octet-stream. Обязательный элемент.

Основной текст запроса

Укажите фактические байты вкладываемого файла, находящиеся в диапазоне расположения, указанном в заголовке запроса Content-Range.

Отклик

Успешная отправка возвращает код отклика HTTP 200 OK и объект uploadSession. Объект отклика имеет указанные ниже свойства.

  • Значение свойства expirationDateTime остается тем же, что было возвращено исходным uploadSession на шаге 1.
  • nextExpectedRanges указывает расположение следующего байта для начала загрузки, например, "nextExpectedRanges":["2097152"]. Байты файла необходимо отправлять по порядку.
  • Свойство uploadUrl не возвращается явно, так как все операции сеанса загрузки PUT используют один и тот же URL-адрес, возвращаемый при создании сеанса (шаг 1).

Пример: первая загрузка в задачу Списка дел

Запрос

Ниже показан пример запроса.

PUT https://graph.microsoft.com/beta/users/6f9a2a92-8527-4d64-837e-b5312852f36d/todo/lists/AAMDiFkfh=/tasks/AAMkADliMm=/attachmentSessions/AAMkADliMm=/content
Content-Type: application/octet-stream
Content-Length: 2097152
Content-Range: bytes 0-2097151/3483322

{
  <bytes 0-2097151 of the file to be attached, in binary format>
}

Отклик

Следующий пример ответа показывает в свойстве nextExpectedRanges начало следующего диапазона байтов, ожидаемого сервером.

HTTP/1.1 200 OK
Content-type: application/json

{
  "ExpirationDateTime":"2022-06-09T10:45:27.4324526Z",
  "NextExpectedRanges":["2097152"]
}

Шаг 3. Продолжение отправки диапазонов байтов вплоть до отправки всего файла

После первоначальной отправки на шаге 2 продолжайте отправлять оставшиеся части файла, используя аналогичный запрос PUT, как описано на шаге 2, до достижения даты и времени окончания срока действия сеанса. Используйте коллекцию nextExpectedRanges, чтобы определить, с чего начать отправку следующего диапазона байтов. Вы можете увидеть несколько диапазонов, указывающих части файла, еще не полученные сервером. Это удобно, когда требуется возобновить прерванную передачу, а клиенту неизвестно состояние службы.

После успешной отправки последнего байта файла операция PUT возвращает HTTP 201 Created и заголовок Location, указывающий URL-адрес вложенного файла. Можно получить ИД вложения по этому URL-адресу и сохранить его для дальнейшего использования.

В следующих примерах покажите, как отправить последний диапазон в файл задачи Списка дел на предыдущих шагах.

Пример: окончательная отправка в задачу Списка дел

Запрос

Ниже показан пример запроса.

PUT https://graph.microsoft.com/beta/users/6f9a2a92-8527-4d64-837e-b5312852f36d/todo/lists/AAMDiFkfh=/tasks/AAMkADliMm=/attachmentSessions/AAMkADliMm=/content
Content-Type: application/octet-stream
Content-Length: 1386170
Content-Range: bytes 2097152-3483321/3483322

{
  <bytes 2097152-3483321 of the file to be attached, in binary format>
}

Отклик

Ниже приведен пример отклика, в котором показан заголовок отклика Location, из которого можно сохранить идентификатор вложения (AAMkADI5MAAIT3drCAAABEgAQANAqbAe7qaROhYdTnUQwXm0=) для последующего использования.

HTTP/1.1 201 Created

Location: https://graph.microsoft.com/beta/users/6f9a2a92-8527-4d64-837e-b5312852f36d/todo/lists/AAMDiFkfh=/tasks/AAMkADliMm=/Attachments/AAMkADI5MAAIT3drCAAABEgAQANAqbAe7qaROhYdTnUQwXm0=
Content-Length: 0

Альтернатива: отмена сеанса отправки

Если необходимо отменить отправку в любое время до окончания срока действия сеанса отправки, можно использовать тот же самый начальный URL-адрес для удаления сеанса отправки. Успешная операция возвращает код отклика HTTP 204 No Content.

Пример: отмена сеанса отправки

Запрос

Ниже показан пример запроса.

DELETE https://graph.microsoft.com/beta/users/6f9a2a92-8527-4d64-837e-b5312852f36d/todo/lists/AAMDiFkfh=/tasks/AAMkADliMm=/attachmentSessions/AAMkADliMm=

Отклик

Ниже приводится пример отклика.

HTTP/1.1 204 No content