Autodesk Forge. NET SDK Функция GetObject и загрузка файлов из центра BIM 360 Docs - PullRequest
0 голосов
/ 20 января 2020

У меня проблемы с использованием функции GetObject из Forge. NET SDK для загрузки файла из BIM 360 Docs хаба.

Вот мой jQuery ajax вызов (на стороне клиента) :

function downloadFile(storageUrl, displayName) {
jQuery.ajax({
    url: '/api/forge/datamanagement/download?' + $.param({ storageUrl: storageUrl }),
    success: function (res) {
        // create a blob url representing the data
        var blob = new Blob([res]);
        var url = window.URL.createObjectURL(blob);
        // attach blob url to anchor element with download attribute
        var anchor = document.createElement('a');
        anchor.setAttribute('href', url);
        anchor.setAttribute('download', displayName);
        anchor.click();
        window.URL.revokeObjectURL(url);
    }
});

А вот мой. NET C# соответствующая функция контроллера (на стороне сервера):

    [HttpGet]
    [Route("api/forge/datamanagement/download")]
    public async Task<dynamic> GetObject(string storageUrl)
    {
        Credentials = await Credentials.FromSessionAsync(base.Request.Cookies, Response.Cookies);
        if (Credentials == null) { return null; }

        ObjectsApi objectsApi = new ObjectsApi();
        objectsApi.Configuration.AccessToken = Credentials.TokenInternal;

        string[] idParams = storageUrl.Split('/');
        string bucketKey = idParams[6];
        string objectName = idParams[8];
        if (objectName.Contains("?"))
            objectName = objectName.Split("?")[0];

        dynamic obj = await objectsApi.GetObjectAsync(bucketKey, objectName);

        if (obj is FileStream)
            return File(obj, "application/octet-stream");

        if (obj is MemoryStream ms)
        {
            FileStream fs = new FileStream(Path.Combine(Path.GetTempPath(), objectName), FileMode.Create, FileAccess.ReadWrite);
            ms.CopyTo(fs);
            ms.Position = 0;
            fs.Position = 0;
            return File(fs, "application/octet-stream");
        }

        return null;
    }

Проблема в том, что после получения результата из GetObjectAsyn c call:

  • Если он возвращает FileStream (например, для файлов .txt), проблем нет, загруженные файлы верны.
  • Если он возвращает MemoryStream (например, для. json и .rvt), я записываю его в FileStream и затем возвращаю. Но работает только для json файлов. Для файлов .rvt загруженные файлы повреждены и не могут быть открыты Revit.

Странно то, что:

  • поврежденные файлы примерно в 2 раза больше, чем "настоящие" / "правильные".
  • при копировании MemoryStream в FileStream временные созданные файлы Revit в моей временной папке сервера являются правильными.

Чего мне здесь не хватает ?

Спасибо за помощь.

Максим

1 Ответ

0 голосов
/ 20 февраля 2020

Возможно, здесь есть проблема с кодировкой, так как вы упомянули, что файл в 2 раза больше.

В любом случае, я бы посоветовал вам использовать вместо этого "прокси". Позвольте мне объяснить: GetObjectAsync загрузит весь файл на ваш сервер, который может быть большим и выделять много памяти. Даже если вы сохраните его локально перед отправкой клиенту, продолжая выделять дисковые ресурсы ...

Подход с использованием прокси-сервера просто получит фрагменты данных из Forge и передаст каждый блок клиенту. Существуют разные способы его реализации, вероятно, этот другой ответ является началом.

...