В настоящее время я разрабатываю приложение, в котором пользователь щелкает элемент, этот элемент вызывает функцию JS, а функция обрабатывает загрузку файла.
Файлы представляют собой отчеты, генерируемые динамически с помощью Devexpress XtraReportsмодуль , преобразованный в Base64 и затем отправленный обратно на сторону клиента. Когда клиент получает строку Base64, функция JS создает элемент <a>
, устанавливает атрибут href на data:application/pdf;base64,JVBERi0xLjQNCiWio[...]
и имитирует щелчок с событием click()
.
Вотфрагмент кода JS, который обрабатывает загрузку файла:
let downloadLink;
try {
downloadLink = executionId ? await getLinkPdfBase64(executionId) : false;
} catch (error) {
downloadLink = false;
console.log(error);
}
if (downloadLink) {
const aElement = document.createElement("a");
downloadLink = "data:application/pdf;base64," + downloadLink;
aElement.setAttribute("download", currentReportData.LayoutName);
aElement.setAttribute("href", downloadLink);
aElement.click();
aElement.remove();
} else {
DevExpress.ui.dialog.alert( //Ignore this, it's a Devexpress component
"Your report could not be generated",
"Alert"
);
}
Проблема:
Когда я генерирую отчет с пользовательскими типами параметров, Devexpress генерирует его правильно(Base64, если преобразовано в строку, визуально правильно сформировано), но браузер (Google Chrome) загружает файл с расширением ". 0" .
Если отчет имеет нормальный Devexpressпараметры (например, Strings, Int32, Guids и т. д.)) файл загружается с правильным ". pdf" расширением.
Вот изображение правильно загруженного PDF и ".0"файл расширения:
Может ли функция JS быть причиной или решением проблемы? Если нет, то почти наверняка что-то не так с генератором отчетов (Devexpress).
Примечание: если я вручную изменю расширение ".0" на ".pdf", файл откроется, и онотображается / формируется правильно.