使用 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
}
}
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Beta.Me.Todo.Lists.Item.Tasks.Item.Attachments.CreateUploadSession;
using Microsoft.Graph.Beta.Models;
var requestBody = new CreateUploadSessionPostRequestBody
{
AttachmentInfo = new AttachmentInfo
{
AttachmentType = AttachmentType.File,
Name = "flower",
Size = 3483322L,
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Me.Todo.Lists["{todoTaskList-id}"].Tasks["{todoTask-id}"].Attachments.CreateUploadSession.PostAsync(requestBody);
请阅读 SDK 文档,了解如何将 SDK 添加到项目并创建 authProvider 实例的详细信息。
// Code snippets are only available for the latest major version. Current major version is $v0.*
// Dependencies
import (
"context"
msgraphsdk "github.com/microsoftgraph/msgraph-beta-sdk-go"
graphusers "github.com/microsoftgraph/msgraph-beta-sdk-go/users"
graphmodels "github.com/microsoftgraph/msgraph-beta-sdk-go/models"
//other-imports
)
requestBody := graphusers.NewItemCreateUploadSessionPostRequestBody()
attachmentInfo := graphmodels.NewAttachmentInfo()
attachmentType := graphmodels.FILE_ATTACHMENTTYPE
attachmentInfo.SetAttachmentType(&attachmentType)
name := "flower"
attachmentInfo.SetName(&name)
size := int64(3483322)
attachmentInfo.SetSize(&size)
requestBody.SetAttachmentInfo(attachmentInfo)
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=go
createUploadSession, err := graphClient.Me().Todo().Lists().ByTodoTaskListId("todoTaskList-id").Tasks().ByTodoTaskId("todoTask-id").Attachments().CreateUploadSession().Post(context.Background(), requestBody, nil)
请阅读 SDK 文档,了解如何将 SDK 添加到项目并创建 authProvider 实例的详细信息。
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
com.microsoft.graph.beta.users.item.todo.lists.item.tasks.item.attachments.createuploadsession.CreateUploadSessionPostRequestBody createUploadSessionPostRequestBody = new com.microsoft.graph.beta.users.item.todo.lists.item.tasks.item.attachments.createuploadsession.CreateUploadSessionPostRequestBody();
AttachmentInfo attachmentInfo = new AttachmentInfo();
attachmentInfo.setAttachmentType(AttachmentType.File);
attachmentInfo.setName("flower");
attachmentInfo.setSize(3483322L);
createUploadSessionPostRequestBody.setAttachmentInfo(attachmentInfo);
var result = graphClient.me().todo().lists().byTodoTaskListId("{todoTaskList-id}").tasks().byTodoTaskId("{todoTask-id}").attachments().createUploadSession().post(createUploadSessionPostRequestBody);
请阅读 SDK 文档,了解如何将 SDK 添加到项目并创建 authProvider 实例的详细信息。
const options = {
authProvider,
};
const client = Client.init(options);
const uploadSession = {
attachmentInfo: {
attachmentType: 'file',
name: 'flower',
size: 3483322
}
};
await client.api('/me/todo/lists/AAMDiFkfh=/tasks/AAMkADliMm=/attachments/createUploadSession')
.version('beta')
.post(uploadSession);
请阅读 SDK 文档,了解如何将 SDK 添加到项目并创建 authProvider 实例的详细信息。
<?php
use Microsoft\Graph\Beta\GraphServiceClient;
use Microsoft\Graph\Beta\Generated\Users\Item\Todo\Lists\Item\Tasks\Item\Attachments\CreateUploadSession\CreateUploadSessionPostRequestBody;
use Microsoft\Graph\Beta\Generated\Models\AttachmentInfo;
use Microsoft\Graph\Beta\Generated\Models\AttachmentType;
$graphServiceClient = new GraphServiceClient($tokenRequestContext, $scopes);
$requestBody = new CreateUploadSessionPostRequestBody();
$attachmentInfo = new AttachmentInfo();
$attachmentInfo->setAttachmentType(new AttachmentType('file'));
$attachmentInfo->setName('flower');
$attachmentInfo->setSize(3483322);
$requestBody->setAttachmentInfo($attachmentInfo);
$result = $graphServiceClient->me()->todo()->lists()->byTodoTaskListId('todoTaskList-id')->tasks()->byTodoTaskId('todoTask-id')->attachments()->createUploadSession()->post($requestBody)->wait();
请阅读 SDK 文档,了解如何将 SDK 添加到项目并创建 authProvider 实例的详细信息。
Import-Module Microsoft.Graph.Beta.Users
$params = @{
attachmentInfo = @{
attachmentType = "file"
name = "flower"
size = 3483322
}
}
# A UPN can also be used as -UserId.
New-MgBetaUserTodoListTaskAttachmentUploadSession -UserId $userId -TodoTaskListId $todoTaskListId -TodoTaskId $todoTaskId -BodyParameter $params
请阅读 SDK 文档,了解如何将 SDK 添加到项目并创建 authProvider 实例的详细信息。
# Code snippets are only available for the latest version. Current version is 1.x
from msgraph_beta import GraphServiceClient
from msgraph_beta.generated.users.item.todo.lists.item.tasks.item.attachments.create_upload_session.create_upload_session_post_request_body import CreateUploadSessionPostRequestBody
from msgraph_beta.generated.models.attachment_info import AttachmentInfo
from msgraph_beta.generated.models.attachment_type import AttachmentType
# To initialize your graph_client, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=python
request_body = CreateUploadSessionPostRequestBody(
attachment_info = AttachmentInfo(
attachment_type = AttachmentType.File,
name = "flower",
size = 3483322,
),
)
result = await graph_client.me.todo.lists.by_todo_task_list_id('todoTaskList-id').tasks.by_todo_task_id('todoTask-id').attachments.create_upload_session.post(request_body)
请阅读 SDK 文档,了解如何将 SDK 添加到项目并创建 authProvider 实例的详细信息。
响应
以下示例显示响应正文中为任务返回的 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