当剩余 0 个字节时,如何使用 FinishUpload 关闭分块文件上传?

How can I use FinishUpload to close a chunked file upload when I have 0 bytes left?

我正在通过 REST API.
将文件分块上传到 SharePoint Online 我正在通过 StartUploadContinueUploadFinishUpload 方法执行此操作,并将它们作为 byte[].

传递一个块

我用这个作为例子来工作:Using chunked upload/StartUpload with sharepoint REST api

文档在这里:https://msdn.microsoft.com/library/office/microsoft.sharepoint.client.file.startupload.aspx

(我没有包含代码,因为我认为它不相关,如果我弄错了请纠正我)

只要总文件大小大于块大小,这就有效。
例如,如果块大小为 1MB,但文件总大小为 4MB,则该方法有效。
如果块大小为 4MB,但文件总大小为 1MB,那么我在上传后会得到空文件或损坏文件。

这是因为对 StartUpload 的初始调用将整个文件包含在一个块中,因此永远不会调用 FinishUpload 来关闭文件。

如果我用一个空 byte[0] 调用 FinishUpload 那么我得到:

Error 500 - Internal Server Error: The upload was incomplete. Try to save again.

在正常情况下,我会简单地检查总文件大小是否小于块大小,而是直接使用 /Files/add(...).

添加文件

不幸的是,我正在以流的形式传递文件块,但我事先不知道总文件大小。我也无法在处理之前保存所有块,我必须将每个块直接传递给 SharePoint。

那么当我没有更多字节要上传时,如何使用 FinishUpload 关闭文件上传?

就此而言,您可以考虑进行以下修改:

1) 如果 总文件大小小于块大小 ,则文件 正在通过单个请求上传。例如:

var fi = new FileInfo(fileName);
if(fi.Length <= chunkSize)
{
   this.UploadFile(address, fileName);
   return;
}

其中 WebClient.UploadFile Method 用于通过 SharePoint RPC 上传文件

2) 否则文件正在通过块会话上传

请参阅 SharePointClient.cs 以获取完整示例。