以下 C# 示例展示了如何使用 StartUpload、ContinueUpload 和 FinishUpload REST 端点覆盖现有文件:
public static void UploadLargeFile(string webUrl, ICredentials credentials, string formDigest, string sourcePath, string targetFolderUrl,int chunkSizeBytes=2048)
{
using (var client = new WebClient())
{
client.BaseAddress = webUrl;
client.Credentials = credentials;
client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
client.Headers.Add("X-RequestDigest", formDigest);
client.Headers.Add("content-type", "application/json;odata=verbose");
//create an empty file first
var fileName = System.IO.Path.GetFileName(sourcePath);
var createFileRequestUrl = string.Format("{0}/_api/web/getfolderbyserverrelativeurl('{1}')/files/add(url='{2}',overwrite=true)", webUrl, targetFolderUrl, fileName);
client.UploadString(createFileRequestUrl, "POST");
var targetUrl = System.IO.Path.Combine(targetFolderUrl, fileName);
var firstChunk = true;
var uploadId = Guid.NewGuid();
var offset = 0L;
using (var inputStream = System.IO.File.OpenRead(sourcePath))
{
var buffer = new byte[chunkSizeBytes];
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}')", webUrl, targetUrl, 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})", webUrl, targetUrl, 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})", webUrl, targetUrl, uploadId, offset);
client.UploadData(endpointUrl, buffer);
}
offset += bytesRead;
Console.WriteLine("%{0:P} completed", (((float)offset / (float)inputStream.Length)));
}
}
}
}
用法
var userCredentials = GetCredentials(userName, password);
var formDigest = RequestFormDigest(webUrl, userCredentials);
UploadLargeFile(webUrl,userCredentials,formDigest, @"C:\Users\jdoe\Documents\SampleVideo_1280x720_5mb.mp4", "/Shared Documents", 1024 * 1024);
- 使用 SharePoint REST 接口
WebClient class,特别是 UploadData Method 用于上传数据。
-
GetCredentials.cs - 获取 SharePoint Online 凭据的方法
- SharePoint REST
POST 请求需要表单摘要,RequestFormDigest 用于此目的(您可以找到
实现它here)
结果