Использование chunked upload/StartUpload с API REST sharepoint
Я хочу загрузить большие файлы в онлайн-хранилище sahrepoint, но я не могу использовать частичную загрузку API REST sharepoint. Я хотел бы увидеть рабочий пример.
API-интерфейс описан здесь https://msdn.microsoft.com/EN-US/library/office/dn450841.aspx с использованием методов
startUpload(GUID, stream1)
continueUpload(GUID, 10 МБ, stream2)
continueUpload (GUID, 20 МБ, stream3)
finishUpload (GUID, 30 МБ, 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 ответ
В следующем примере C# показано, как перезаписать существующий файл с помощью StartUpload
, ContinueUpload
, а также FinishUpload
Конечные точки 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
предназначен для этой цели (вы можете найти реализацию здесь)
Результат