Ответы пользователя по тегу Laravel
  • Как реализовать скачивание файла через AJAX?

    sokollondon
    @sokollondon
    Как скачать файл после получения его по ajax
    Удобно когда файл долго создаётся и нужно показать preloader

    Пример при отправке веб-формы
    $(function () {
        $('form').submit(function () {
            $('#loader').show();
            $.ajax({
                url: $(this).attr('action'),
                data: $(this).serialize(),
                dataType: 'binary',
                xhrFields: {
                    'responseType': 'blob'
                },
                success: function(data, status, xhr) {
                    $('#loader').hide();
                    // if(data.type.indexOf('text/html') != -1){//Если вместо файла получили страницу с ошибкой
                    //     var reader = new FileReader();
                    //     reader.readAsText(data);
                    //     reader.onload = function() {alert(reader.result);};
                    //     return;
                    // }
                    var link = document.createElement('a'),
                        filename = 'file.xlsx';
                    // if(xhr.getResponseHeader('Content-Disposition')){//имя файла
                    //     filename = xhr.getResponseHeader('Content-Disposition');
                    //     filename=filename.match(/filename="(.*?)"/)[1];
                    //     filename=decodeURIComponent(escape(filename));
                    // }
                    link.href = URL.createObjectURL(data);
                    link.download = filename;
                    link.click();
                }
            });
            return false;
        });
    });

    Не обязательный функционал закомментирован для упрощения примера.

    Не требуется создавать временные файлы на сервере.

    На jQuery v2.2.4 всё работает. На старой версии будет ошибка:
    Uncaught DOMException: Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'blob').

    https://stackoverflow.com/a/60185326/4831608
    Ответ написан
    1 комментарий