Здравствуйте! Приношу свои извинения, если что-то подобное уже было на форуме. Имеется приложение (калькулятор), который средствами JS на стороне клиента собирает HTML таблицу. И есть PHP скрипт, который генерирует PDF файлы (Библиотека FPDF). Задача стоит в том, что бы отправить средствами JQery PHP-скрипту данные и получить сгенерированный PDF файл. Сам скрипт, при прямом обращении (http://Имя_сайта/exptopdf.php) к нему работает без проблем. А используя ajax, единственное, что я смог сделать - это вывести набор символов в <div>. Подскажите, почему PHP скрипт при обращение к нему через JQuery, не срабатывает так же, как при прямом? и как это можно реализовать? Уровень JS грамотности - нулевой. Только начал с ним работать, если возможно, немного содержательнее подсказывать. Заранее благодарен.
Нужно отдать на скачивание. Библиотека FPDF позволяет выводить на экран и отдать на скачивание. Но у меня получается это сделать только при прямом обращение к скрипту.
Самый простой и кроссбраузерный способ - это использовать скрытый iframe. Но если хотите именно с использованием ajax, то можно так: Код (PHP): $(function () { $.ajax({ url: 'handler.php', // путь к обработчику type: 'POST', // или GET (не имеет значения) data: {some_key: some_val}, // данные, которые нужно передать на сервер success: function (response, status, xhr) { var filename = '', disposition = xhr.getResponseHeader('Content-Disposition'); if (disposition && disposition.indexOf('attachment') !== -1) { var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/, matches = filenameRegex.exec(disposition); if (matches !== null && matches[1]) filename = matches[1].replace(/['"]/g, ''); } var type = xhr.getResponseHeader('Content-Type'), blob = new Blob([response], { type: type }); if (typeof window.navigator.msSaveBlob !== 'undefined') { window.navigator.msSaveBlob(blob, filename); } else { var URL = window.URL || window.webkitURL, downloadUrl = URL.createObjectURL(blob); if (filename) { var a = document.createElement("a"); if (typeof a.download === 'undefined') { window.location = downloadUrl; } else { a.href = downloadUrl; a.download = filename; document.body.appendChild(a); a.click(); $(a).remove(); } } else { window.location = downloadUrl; } setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 100); } } }); }); Только в осле ниже 10 версии работать не будет. Можно и с помощью FileReader API, но проблема та же - старые ослы не поддерживают. Добавлено спустя 4 минуты 48 секунд: P.S. Забыл добавить... В обработчике Код (PHP): /* прочие телодвижения */ $pdf->Output('mypdf.pdf','D'); // destination - D exit; // рекомендую
Попробовал, ничего не получилось. Заменил URL и DATA. (Хотя 2ое не имеет значения). Может что-то еще нужно заменить, сам никак не разберусь. Спасибо.
denis01, там и заголовки не нужны, т.к. это уже реализовано в классе. Человеку просто хочется "по-модному"
А почему бы вам действительно просто не сделать ссылкой? Перезагрузки страницы не будет, да и пользователю строго пофиг, как он получает файл. Я вам дал стопроцентно рабочий код. Если сейчас будем разбирать костыль с iframe-ом, то не удивлюсь, что у вас опять что-то не будет работать.
Не совсем понял, как это сделать ссылкой? просто на exptopdf.php? Такой вариант не сработает. т.к. мне надо будет передавать данные. Вот общий вид калькулятора. Внизу формируется html таблица. (на основании выбранных пользователем данных). Количество полей произвольное. И эту таблицу мне надо отдать пользователю PDF файлом.