Возобновить загрузку файла с помощью Forge SDK, ошибка UploadChunkWithHttpInfo - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь загрузить файл, используя SDK для .Net, используя этот пример: https://forge.autodesk.com/blog/c-resumable-upload-file-forge-sdk

Если я использую REST API напрямую, я могу без проблем создавать сегменты и загружать файлы, используя прямую загрузку без фрагментов. Если я использую метод SDK, я всегда получаю

Message: "An error has occurred."
ExceptionMessage: "Error calling UploadChunk: {"developerMessage":"ACM check failed, user or calling service does not have access to perform this operation","userMessage":"","errorCode":"AUTH-012","more info":"http://developer.api.autodesk.com/documentation/v1/errors/AUTH-012"}"
ExceptionType: "Autodesk.Forge.Client.ApiException"
StackTrace: "   at Autodesk.Forge.ObjectsApi.UploadChunkWithHttpInfo(String bucketKey, String objectName, Nullable`1 contentLength, String contentRange, String sessionId, Stream body, String contentDisposition, String ifMatch)

Я проверил, что ключи корзины одинаковы. Я использую версию 1.4.0 SDK, доступна версия 1.5.1 Alpha, которую я предпочел бы не использовать.

1 Ответ

0 голосов
/ 09 ноября 2018

Итак, я попытался этот код с параметром HttpInfo, как показано ниже, и работал нормально. Из вашего сообщения, и как указал @Bryan Huang, ошибка, скорее всего, связана с аутентификацией (или временным сбоем)

long chunkSize = 2 * 1024 * 1024; // 2 Mb
long numberOfChunks = (long)Math.Round((double)(fileSize / chunkSize)) + 1;

progressBar.Maximum = (int)numberOfChunks;

long start = 0;
chunkSize = (numberOfChunks > 1 ? chunkSize : fileSize);
long end = chunkSize;
string sessionId = Guid.NewGuid().ToString();

// upload one chunk at a time
using (BinaryReader reader = new BinaryReader(new FileStream(filePath, FileMode.Open)))
{
    for (int chunkIndex = 0; chunkIndex < numberOfChunks; chunkIndex++)
    {
        string range = string.Format("bytes {0}-{1}/{2}", start, end, fileSize);

        long numberOfBytes = chunkSize + 1;
        byte[] fileBytes = new byte[numberOfBytes];
        MemoryStream memoryStream = new MemoryStream(fileBytes);
        reader.BaseStream.Seek((int)start, SeekOrigin.Begin);
        int count = reader.Read(fileBytes, 0, (int)numberOfBytes);
        memoryStream.Write(fileBytes, 0, (int)numberOfBytes);
        memoryStream.Position = 0;

        dynamic chunkUploadResponse = await objects.UploadChunkAsyncWithHttpInfo(bucketKey, objectKey, (int)numberOfBytes, range, sessionId, memoryStream);

        start = end + 1;
        chunkSize = ((start + chunkSize > fileSize) ? fileSize - start - 1 : chunkSize);
        end = start + chunkSize;

        progressBar.CustomText = string.Format("{0} Mb uploaded...", (chunkIndex * chunkSize) / 1024 / 1024);
        progressBar.Value = chunkIndex;
    }
}
...