Элемент ‹a› не распознает расширение файла автоматически при загрузке файла

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


person Néstor Carreño Gimeno    schedule 17.10.2019    source источник


Ответы (1)


Оказывается, я решил эту проблему, просто добавив расширение файла .pdf" в атрибут download, поэтому, когда браузер не может его распознать, вы уже указываете, какой именно:

aElement.setAttribute("download", currentReportData.LayoutName + ".pdf");
person Néstor Carreño Gimeno    schedule 17.10.2019
comment
Это переопределяет расширение .0 или объединяет его как .0.pdf? - person cengiz sevimli; 23.10.2019
comment
@cengizsevimli переопределяет расширение, поэтому, если у вас есть такой файл, как file.0, вы получите файл .pdf. - person Néstor Carreño Gimeno; 23.10.2019