【问题标题】:How to implement resumable upload using Microsoft.Graph.GraphServiceClient from C#如何使用 C# 中的 Microsoft.Graph.GraphServiceClient 实现可恢复上传
【发布时间】:2019-06-17 10:44:40
【问题描述】:

有人知道如何使用 C# OneDrive SDK 执行可恢复上传吗?

当我使用 IDriveItemRequestBuilder.CreateUploadSession 时,我总是会得到一个重置 NextExpectedRanges 的新会话。 如果我使用 .UploadURL 并手动发送 HTTP Post,我会得到正确的下一个范围,但是我不知道使用 sdk 恢复上传会话的方法。似乎没有从 API 到“OpenUploadSession”的方法,或者至少我能找到。 我也找不到一个可行的例子。 我怀疑这一定是一个常见的用例。

请注意文本中的关键字 - resumable

【问题讨论】:

  • 仅供参考,不理想,但缓存 UploadSessions(合并最后一个 NextExpectedRanges)似乎可行,但它远非想法,并且不会帮助进程重启后恢复。
  • 这怎么可能是重复的?您发布的链接显示了如何使用 API 在一个会话中上传所有内容。正如标题中明确指出的那样,我正在尝试能够恢复上传。这意味着要么从参数重新构建上传会话(鉴于没有“打开上传会话 API”,这似乎是不可能的,或者在某种地图中缓存上传会话。后者有效但并不理想;如果进程终止,那么地图也是如此。因此,如果由于进程终止而中断上传,则必须重新上传整个文件。
  • 我很抱歉 - 在内部,我们将基于会话的上传称为可恢复上传,我以不同的方式阅读您的问题。我明白你现在的要求了。

标签: c# onedrive microsoft-graph-sdks


【解决方案1】:

我一直在寻找同样的东西,只是从官方文档中找到了一个例子: https://docs.microsoft.com/en-us/graph/sdks/large-file-upload?tabs=csharp.

我尝试了代码,它成功了。

以防万一,我的示例实现:https://github.com/xiaomi7732/onedrive-sample-apibrowser-dotnet/blob/6639444d6298492c38f841e411066635760930c2/OneDriveApiBrowser/FormBrowser.cs#L565

【讨论】:

    【解决方案2】:

    恢复的方法取决于你有多少状态。所需的最低限度是UploadSession.UploadUrl(将其视为会话的唯一标识符)。如果您没有该 URL,则需要创建一个新的上传会话并从头开始,否则如果您有该 URL,则可以执行以下操作来恢复:

    var uploadSession = new UploadSession
    {
        NextExpectedRanges = Enumerable.Empty<string>(),
        UploadUrl = persistedUploadUrl,
    };
    
    var maxChunkSize = 320 * 1024; // 320 KB - Change this to your chunk size. 5MB is the default.
    var provider = new ChunkedUploadProvider(uploadSession, graphClient, ms, maxChunkSize);
    
    // This will query the service and make sure the remaining ranges are accurate.
    uploadSession = await provider.UpdateSessionStatusAsync();
    
    // Since the remaining ranges is now accurate, this will return the requests required to
    // complete the upload.
    var chunkRequests = provider.GetUploadChunkRequests();
    
    ...
    

    如果你有更多的状态,你可以跳过上面的一些。例如,如果您已经有一个 ChunkedUploadProvider,但不知道它是否准确(可能它已序列化到磁盘或其他东西),那么您可以通过调用 UpdateSessionStatusAsync 来启动该过程。

    仅供参考,您可以查看ChunkedUploadProvider here 的代码,以防有助于了解幕后情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-04
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多