我正在尝试使用守护程序应用程序将大文件上传到用户的OneDrive for Business帐户。我已经设法验证并获得持票人令牌,创建文件夹并上传小文件。
对于大型文件,我创建了一个上传会话,并在尝试使用该会话添加文件部件时收到错误。我已经包含了我的小提琴痕迹来尝试诊断这个。我删除了敏感信息。
我请求上传会话
POST https://graph.microsoft.com/v1.0/users/{user id}/drive/items/{folder id}:/Test.csv:/createUploadSession HTTP/1.1
Authorization: Bearer {bearer token}
Content-Type: application/x-www-form-urlencoded
Host: graph.microsoft.com
Content-Length: 0
我收到了以下内容的回复:
"@odata.context":"https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.uploadSession",
"expirationDateTime":"2016-10-05T11:39:29.5104044Z",
"nextExpectedRanges":["0-"],
"uploadUrl":"https://{my tenant name}.sharepoint.com/personal/name_domain_co_za/_api/v2.0/drive/root:/Backups/Test:/uploadSession?guid='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'&path='~tmp12_Test.csv'&overwrite=True&rename=False"}
然后我尝试PUT到上传网址
PUT https://{my tenant name}.sharepoint.com/personal/name_domain_co_za/_api/v2.0/drive/root:/Backups/Test:/uploadSession?guid='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'&path='~tmp12_Test.csv'&overwrite=True&rename=False HTTP/1.1
Authorization: bearer {bearer token}
Content-Range: bytes 0-327679/16333102
Host: {my tenant name}.sharepoint.com
Content-Length: 327680
Expect: 100-continue
然后回复包含以下相关行。
HTTP/1.1 401 Unauthorized
x-ms-diagnostics: 3000006;reason="Token contains invalid signature.";category="invalid_client"
{"error_description":"Invalid issuer or signature."}
我觉得很奇怪,因为使用当前的应用程序配置,我可以成功地将一个小文件上传到同一个路径,所以,除非我误解了某些内容,否则权限应该没有任何问题。
答案 0 :(得分:0)
此处存在相同问题:正确执行上传小文件。
要上传较大的文件,测试端点" https://graph.microsoft.com/beta"用于实现"上传会话"。这个请求成功了。
但是当使用这个"上传会话" URI,HTTP PUT命令失败:
x-ms-diagnostics:3000006; reason ="令牌包含无效签名。&#34 ;; category =" invalid_client"
这是发送大文件的C#代码:
using (var client = new HttpClient())
{
byte[] sContents = File.ReadAllBytes(@"<MYLARGEFILE>");
long length = sContents.Length;
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessTokenGraphMicrosoft);
var content = new ByteArrayContent(sContents);
content.Headers.Add("Content-Length", length.ToString());
var response = client.PutAsync(<UPLOADSESSIONURI>, content).Result;
}
答案 1 :(得分:0)
更新
实际问题是该请求试图使用仅限app的令牌通过Graph对OneDrive for Business进行身份验证。不幸的是,这种情况目前不受支持,虽然某些情况可能有效,但有一些情况没有(例如这一个)。虽然我们无法评论时间表,但它绝对是我们的关注点!
原件:
通过Graph将片段上传到OneDrive for Business帐户有很多因素。
身份验证令牌不兼容。换句话说,用于在图上调用createUploadSession
的承载令牌不能用于直接命中OneDrive for Business端点的PUT
请求。这主要是因为令牌绑定到特定受众群体 - https://graph.microsoft.com/
的令牌无法在https://{my tenant name}.sharepoint.com/
上使用。
由于#1,返回的uploadUrl
实际上不应该首先需要auth - 我们不希望开发人员为不同的端点处理多个auth令牌。
似乎#2就是你所描述的重复事情并不完全正确的地方。您是否可以确认您收到的uploadUrl
值不包含access_token
或prooftoken
个查询参数?如果是这种情况,您是否可以从request-id
电话的响应中获得createUploadSession
标头?
答案 2 :(得分:0)
创建上传会话后,在上传文件时出现了相同的错误。经过大量的试验错误后,我得出结论,只有在文档名称包含空格的情况下,我才得到此提示。
原因是因为createUploadSession响应中返回的上载URL已被URL编码。我的REST客户端对它进行了双重编码,因为它假定未进行编码。一旦进行了双重编码,就无法在服务器上找到上传会话,它会返回401,其中包含一个空的正文。