За последние 24 часа нас посетил 17631 программист и 1722 робота. Сейчас ищет 931 программист ...

AJAX, обработка запроса.

Тема в разделе "JavaScript и AJAX", создана пользователем www_22, 9 янв 2015.

  1. www_22

    www_22 Новичок

    С нами с:
    9 янв 2015
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте! Приношу свои извинения, если что-то подобное уже было на форуме.
    Имеется приложение (калькулятор), который средствами JS на стороне клиента собирает HTML таблицу. И есть PHP скрипт, который генерирует PDF файлы (Библиотека FPDF). Задача стоит в том, что бы отправить средствами JQery PHP-скрипту данные и получить сгенерированный PDF файл. Сам скрипт, при прямом обращении (http://Имя_сайта/exptopdf.php) к нему работает без проблем. А используя ajax, единственное, что я смог сделать - это вывести набор символов в <div>.
    [​IMG]
    Подскажите, почему PHP скрипт при обращение к нему через JQuery, не срабатывает так же, как при прямом? и как это можно реализовать?

    Уровень JS грамотности - нулевой. Только начал с ним работать, если возможно, немного содержательнее подсказывать. Заранее благодарен.
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Вам нужно вывести pdf-файл на экран или отдать на скачивание?
     
  3. www_22

    www_22 Новичок

    С нами с:
    9 янв 2015
    Сообщения:
    5
    Симпатии:
    0
    Нужно отдать на скачивание.
    Библиотека FPDF позволяет выводить на экран и отдать на скачивание. Но у меня получается это сделать только при прямом обращение к скрипту.
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Самый простой и кроссбраузерный способ - это использовать скрытый iframe. Но если хотите именно с использованием ajax, то можно так:
    Код (PHP):
    1. $(function () {
    2.     $.ajax({
    3.         url: 'handler.php', // путь к обработчику
    4.         type: 'POST', // или GET (не имеет значения)
    5.         data: {some_key: some_val}, // данные, которые нужно передать на сервер
    6.         success: function (response, status, xhr) {
    7.             var filename = '',
    8.                 disposition = xhr.getResponseHeader('Content-Disposition');
    9.             if (disposition && disposition.indexOf('attachment') !== -1) {
    10.                 var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/,
    11.                     matches = filenameRegex.exec(disposition);
    12.                 if (matches !== null && matches[1]) filename = matches[1].replace(/['"]/g, '');
    13.             }
    14.             var type = xhr.getResponseHeader('Content-Type'),
    15.                 blob = new Blob([response], {
    16.                     type: type
    17.                 });
    18.  
    19.             if (typeof window.navigator.msSaveBlob !== 'undefined') {
    20.                 window.navigator.msSaveBlob(blob, filename);
    21.             } else {
    22.                 var URL = window.URL || window.webkitURL,
    23.                     downloadUrl = URL.createObjectURL(blob);
    24.  
    25.                 if (filename) {
    26.                     var a = document.createElement("a");
    27.                     if (typeof a.download === 'undefined') {
    28.                         window.location = downloadUrl;
    29.                     } else {
    30.                         a.href = downloadUrl;
    31.                         a.download = filename;
    32.                         document.body.appendChild(a);
    33.                         a.click();
    34.                         $(a).remove();
    35.                     }
    36.                 } else {
    37.                     window.location = downloadUrl;
    38.                 }
    39.  
    40.                 setTimeout(function () {
    41.                     URL.revokeObjectURL(downloadUrl);
    42.                 }, 100);
    43.             }
    44.         }
    45.     });
    46. });
    Только в осле ниже 10 версии работать не будет. Можно и с помощью FileReader API, но проблема та же - старые ослы не поддерживают.

    Добавлено спустя 4 минуты 48 секунд:
    P.S. Забыл добавить... В обработчике
    Код (PHP):
    1. /* прочие телодвижения  */
    2. $pdf->Output('mypdf.pdf','D'); // destination - D
    3. exit; // рекомендую  
     
  5. www_22

    www_22 Новичок

    С нами с:
    9 янв 2015
    Сообщения:
    5
    Симпатии:
    0
    Попробовал, ничего не получилось.
    Заменил URL и DATA. (Хотя 2ое не имеет значения). Может что-то еще нужно заменить, сам никак не разберусь. Спасибо.
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    В консоль заглядывали? Ошибки есть?
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    зачем ajax? просто сделать перенаправление на файл и отдать заголовки, чтобы началось скачивание
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    denis01, там и заголовки не нужны, т.к. это уже реализовано в классе. Человеку просто хочется "по-модному" ;)
     
  9. www_22

    www_22 Новичок

    С нами с:
    9 янв 2015
    Сообщения:
    5
    Симпатии:
    0
    Одна есть, но со всем с этим никак не связана.
    А что за вариант был с iFrame?
     
  10. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    А почему бы вам действительно просто не сделать ссылкой? Перезагрузки страницы не будет, да и пользователю строго пофиг, как он получает файл. Я вам дал стопроцентно рабочий код. Если сейчас будем разбирать костыль с iframe-ом, то не удивлюсь, что у вас опять что-то не будет работать.
     
  11. www_22

    www_22 Новичок

    С нами с:
    9 янв 2015
    Сообщения:
    5
    Симпатии:
    0
    Не совсем понял, как это сделать ссылкой? просто на exptopdf.php? Такой вариант не сработает. т.к. мне надо будет передавать данные.
    Вот общий вид калькулятора. Внизу формируется html таблица. (на основании выбранных пользователем данных). Количество полей произвольное. И эту таблицу мне надо отдать пользователю PDF файлом.
    [​IMG]