使用chunked upload / StartUpload和sharepoint REST api

时间:2015-11-09 09:22:11

标签: sharepoint sharepoint-online chunked

我想将大型文件上传到sahrepoint在线,但我无法使用sharepoint REST api的分块上传。我想看一个有效的例子。

api在这里描述 https://msdn.microsoft.com/EN-US/library/office/dn450841.aspx#bk_FileStartUpload 使用方法

startUpload(GUID,stream1) continueUpload(GUID,10 MB,stream2)
continueUpload(GUID,20 MB,stream3)
finishUpload(GUID,30 MB,stream4)

我发现了同样的问题 的 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/5596f87a-3155-4e4f-a6e8-8d38fa5e580d/office-365-onedrive-for-businesssharepoint-rest-api-startupload-command?forum=appsforsharepoint

但解决方案使用C#,我需要REST。

1 个答案:

答案 0 :(得分:0)

以下C#示例显示了如何使用StartUploadContinueUploadFinishUpload REST端点覆盖现有文件:

using (var client = new WebClient())
{
    client.BaseAddress = webUri;
    client.Credentials = GetCredentials(webUri, userName, password);
    client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
    client.Headers.Add("X-RequestDigest", RequestFormDigest());

    var fileUrl = "/Documents/SharePoint User Guide.docx";
    var endpointUrlS = string.Format("{0}/_api/web/getfilebyserverrelativeurl('{1}')/savebinarystream", webUri, fileUrl);
    var fileContent = System.IO.File.ReadAllBytes(fileName);

    var firstChunk = true;
    var uploadId = Guid.NewGuid();
    var offset = 0L;
    const int chunkSize = 2048; //<-set chunk size (bytes)
    using (var inputStream = System.IO.File.OpenRead(fileName))
    {
         var buffer = new byte[chunkSize];
         int bytesRead;
         while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
         {
              if (firstChunk)
              {
                  var endpointUrl = string.Format("{0}/_api/web/getfilebyserverrelativeurl('{1}')/startupload(uploadId=guid'{2}')", webUri, fileUrl,uploadId);
                  client.UploadData(endpointUrl, buffer);
                  firstChunk = false;                           
              }
              else if (inputStream.Position == inputStream.Length)
              {
                  var endpointUrl = string.Format("{0}/_api/web/getfilebyserverrelativeurl('{1}')/finishupload(uploadId=guid'{2}',fileOffset={3})", webUri, fileUrl, uploadId,offset);
                  var finalBuffer = new byte[bytesRead];
                  Array.Copy(buffer , finalBuffer , finalBuffer.Length);
                  client.UploadData(endpointUrl, finalBuffer);
              }
              else
              {
                  var endpointUrl = string.Format("{0}/_api/web/getfilebyserverrelativeurl('{1}')/continueupload(uploadId=guid'{2}',fileOffset={3})", webUri, fileUrl, uploadId, offset);
                  client.UploadData(endpointUrl, buffer);
              }
              offset += bytesRead;
              Console.WriteLine("%{0:P} completed", (((float)offset / (float)inputStream.Length) ));
          }
      }
 }
  
      
  • 使用SharePoint REST界面WebClient class,特别是UploadData Method用于上传数据。
  •   
  • GetCredentials.cs - 获取SharePoint Online凭据的方法
  •   
  • SharePoint REST POST请求需要表单摘要,RequestFormDigest用于此目的(您可以找到   它的实施here
  •   

<强>结果

enter image description here