// returns a string to use as a file claim token private string uploadFileIncrementally(byte[] bytes) { int chunkSize = 16000; onUploadStarted(bytes.Length); string claimToken = wsClient.UploadFileStart(accessToken(), bytes.Length, chunkSize); int numChunks = bytes.Length / chunkSize; int fragmentChunkSize = bytes.Length % chunkSize; if (fragmentChunkSize > 0) { numChunks += 1; } // move the full-sized chunks int numUploaded = 0; byte[] buffer = new byte[chunkSize]; for (int i = 0; i < (numChunks - 1); i++) { Array.Copy(bytes, i * chunkSize, buffer, 0, chunkSize); if (wsClient.UploadFilePart(accessToken(), claimToken, i, buffer) == false) { return(null); } numUploaded += chunkSize; onPartUploaded(numUploaded, bytes.Length); } // move the fragment chunk (if any) if (fragmentChunkSize > 0) { buffer = new byte[fragmentChunkSize]; Array.Copy(bytes, (numChunks - 1) * chunkSize, buffer, 0, fragmentChunkSize); if (wsClient.UploadFilePart(accessToken(), claimToken, numChunks - 1, buffer) == false) { return(null); } numUploaded += fragmentChunkSize; onPartUploaded(numUploaded, bytes.Length); } // end the upload if (wsClient.UploadFileEnd(accessToken(), claimToken) == false) { return(null); } onUploadEnded(bytes.Length); return(claimToken); }