В настоящее время я разрабатываю приложение, в котором пользователь нажимает на элемент, этот элемент вызывает функцию 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).
NB: Если я вручную изменю расширение «.0» на «.pdf», файл откроется и будет правильно отображаться/формироваться.