Возобновляемая загрузка файла при помощи Forge SDK на C#
Любой файл может быть загружен в Forge путем прямой загрузки в Data Management API:
PUT buckets/:bucketKey/objects/:objectName
В то время, как это большой файл, загрузка напрямую небезопасна. Если подключение к Интернету капризничает, то загрузка будет прервана, что приведет к тому, что все предыдущие работы будут напрасными. Поэтому настоятельно рекомендуется использовать возобновляемую загрузку.
PUT buckets/:bucketKey/objects/:objectName/resumable
Базовая логика этого метода является разделение большого файла на части (chunks), а затем выгрузка частей одой за другой. Параметр этого HTTP-запроса (Session-Id) является строкой, которая уникально идентифицирует сессию, в которой файла загружается, с помощью которого Forge может знать, как объединить части вместе.
Forge SDK обеспечивает удобный способ для возобновляемой выгрузки. например, при помощи C # SDK. Тестовый пример имеет демонстрацию только прямой выгрузки. Поэтому я добавил немного кода, основанного на примере, чтобы осуществить возобновляемую загрузку.
- private static dynamic resumableUploadFile()
- {
- Console.WriteLine("*****начать выгрузку большого файла");
- string path = FILE_PATH;
- if (!File.Exists(path))
- path = @"..\..\..\" + FILE_PATH;
- // общий размер файла
- long fileSize = new System.IO.FileInfo(path).Length;
- //размер части, допустим, 2M
- long chunkSize = 2 * 1024 * 1024 ;
- // количество частей
- long nbChunks = (long)Math.Round(0.5 + (double)fileSize / (double)chunkSize);
- // записать глобальный ответ для следующей функции
- ApiResponse<dynamic> finalRes = null ;
- using (FileStream streamReader = new FileStream(path, FileMode.Open))
- {
- // уникальный идентификатор этой сессии
- string sessionId = RandomString(12);
- for (int i = 0; i < nbChunks; i++)
- {
- // начальная двоичная позиция конкретного файла
- long start = i * chunkSize;
- // конечная двоичная позиция конкретного файла
- // если размер последней части больше, чем общий размер файла,
- // то конечная бинарная позиция будет конечной бинарной позицией файла
- long end = Math.Min(fileSize, (i + 1) * chunkSize) - 1;
- // передать Forge информацию об этой части
- string range = "bytes " + start + "-" + end + "/" + fileSize;
- // длинна этой части
- long length = end - start + 1;
- // прочитать файловый поток этой части
- byte[] buffer = new byte[length];
- MemoryStream memoryStream = new MemoryStream(buffer);
- int nb = streamReader.Read(buffer, 0, (int)length);
- memoryStream.Write(buffer, 0, nb);
- memoryStream.Position = 0;
- // выгрузить часть в Forge bucket
- ApiResponse<dynamic> response = objectsApi.UploadChunkWithHttpInfo(BUCKET_KEY,
- FILE_NAME, (int)length, range, sessionId, memoryStream,
- "application/octet-stream");
- finalRes = response;
- if (response.StatusCode == 202){
- Console.WriteLine("одна конкретная часть файла была выгружена");
- continue;
- }
- else if(response.StatusCode == 200){
- Console.WriteLine("последняя часть файла была выгружена");
- }
- else{
- // любая ошибка
- Console.WriteLine(response.StatusCode);
- break;
- }
- }
- }
- return (finalRes);
- }
Источник: https://forge.autodesk.com/blog/c-resumable-upload-file-forge-sdk
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 03.04.2017