将文件附加到待办事项任务

使用 Microsoft Graph 中的待办事项 API,可将高达 25 MB 的文件附加到 todoTask。 根据文件大小,选择以下两种方法之一来附加文件:

  • 若要附加任何大小的文件,请创建上传会话,并迭代使用 PUT 上传文件的字节范围,直到上传整个文件为止。 最后一个成功 PUT 响应中的标头包括带附件 ID 的 URL。
  • 如果文件大小小于 3 MB,请对 todoTask的附件导航属性执行单个POST;了解如何为任务执行此操作。 成功的 POST 响应包括文件附件的 ID。

本文演示了第一种方法。 你将逐步了解如何创建和使用上传会话向任务添加文件附件。

第 1 步:创建上传会话

创建上传会话 以将文件附加到 todoTask。 在输入参数 attachmentInfo 中指定文件。

成功的操作返回 HTTP 201 Created 和新的 uploadSession 实例,其中包含可在后续 PUT 操作中用于上传文件各部分的非跳转 URL。 uploadSession 提供一个临时存储位置,在此位置保存文件字节数,直到完整文件上传完毕。

响应中的 uploadSession 对象还包括 nextExpectedRanges 属性,该属性指示初始上传起始位置应为字节 0

权限

要调用此 API,需要以下权限之一。 若要了解详细信息,包括如何选择权限的信息,请参阅权限

权限类型 权限(从最低特权到最高特权)
委派(工作或学校帐户) Tasks.ReadWrite
委派(个人 Microsoft 帐户) Tasks.ReadWrite
Application 不支持。

示例:为 todoTask 创建上传会话

请求

以下示例显示创建上传会话的请求。

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:使用上传会话上传文件的字节范围

如果要上传文件或文件的一部分,请在 uploadSession 资源的 uploadUrl 属性中,将 /content 附加到第 1 步返回的 URL,并在附加的 URL 上进行 PUT 请求。 可上传整个文件,或将文件拆分为多个字节范围。 每个字节范围需要小于 4 MB。

指定请求标头和请求正文,如以下部分所述。

请求标头

名称 类型 说明
Authorization String 持有者 {token}。 必填。 详细了解 身份验证和授权
Content-Length Int32 此操作中上传的字节数。 每个 PUT 操作的字节数上限为 4 MB。 任何大于 4 MB 的请求都将失败。 必填。
Content-Range 字符串 此操作中要上传的文件的从 0 开始的字节范围,格式为 bytes {start}-{end}/{total}。 必填。
Content-Type String MIME 类型。 指定 application/octet-stream。 必填。

请求正文

指定要附加的文件的实际字节数,它们位于由 Content-Range 请求标头指定的位置范围内。

响应

成功上传将返回 HTTP 200 OK 响应代码和 uploadSession 对象。 请注意响应对象中的以下项:

  • expirationDateTime 属性值与步骤 1 中的初始 uploadSession 返回的值相同。
  • nextExpectedRanges 指定上传开始的下一个字节位置,例如 "nextExpectedRanges":["2097152"]。 必须按顺序上传文件中的字节。
  • uploadUrl 属性不会显式返回,因为上传会话的所有 PUT 操作使用创建会话时返回的同一 URL(步骤 1)。

示例:首先上传到 todoTask

请求

以下示例显示了一个请求。

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 中的初始上传后,在会话的到期日期/时间前,使用步骤 2 中所述的 PUT 请求,继续上传文件中剩余的部分。 使用 nextExpectedRanges 集合确定要上传的下一个字节范围的开头。 可能会发现指定的多个范围,这些范围指明了服务器尚未收到的文件部分。 如果需要恢复中断的传输,并且客户端不能确定服务的状态,这个方法很有用。

成功上传文件的最后一个字节后,最终 PUT 操作将返回 HTTP 201 Created 响应代码和指示文件附件 URL 的 Location 标头。 可从 URL 获取附件 ID 并将其保存供以后使用。

下列示例显示在此处理步骤中将文件的最后一个字节范围上传到 todoTask

示例:最终上传到 todoTask

请求

以下示例显示了一个请求。

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>
}

响应

下列示例显示可保存附件 ID(AAMkADI5MAAIT3drCAAABEgAQANAqbAe7qaROhYdTnUQwXm0=)以供随后使用的 Location 响应标头。

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 来删除上传会话。 成功的操作返回 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