У меня проблемы с использованием функции 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 в моей временной папке сервера являются правильными.
Чего мне здесь не хватает ?
Спасибо за помощь.
Максим