ExtJS: Получить файл из ответа на пост-запрос Ajax - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать способ генерирования PDF-файлов из моего приложения extjs.Когда нажимается моя кнопка экспорта, запускается этот Ajax-запрос

Ext.Ajax.request({
    url: 'data/apppdf.php?class=Export&action=composerCSV',
    method: 'POST',
    timeout: 1200000,
    params: {
        id: id
    },

    success: function (response, opts) {
        // i don't know what to do here
    }
});

. В моем PHP-файле я создаю PDF-файл, используя FPDF библиотеку, например

$pdf = new FPDF();
// fill my file
return $pdf->Output(null, "rapport" . date('Y-m-d_H:i:s'));

послеУспех моего запроса и конец моего скрипта, где файл возвращается, как сделать его доступным для пользователя (как я могу получить всплывающее окно открытия / сохранения с действительным файлом PDF)?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Я обычно использую этот подход, хотя может существовать лучшее решение:

  • определить окно просмотра
  • создать файл PDF на сервере
  • скачать и просмотреть файл PDF

Часть ExtJS:

Ext.define('Test.ReportWindow', {
    extend: 'Ext.window.Window',

    xfilename: '',
    xtitle: '',

    layout : 'fit',
    width: 1200,
    height: 800,
    maximizable: true,

    initComponent: function() {
        var me = this;

        me.callParent(arguments);
        me.title = me.xtitle;
        me.add(
            {
            xtype: "box",
            autoEl : {tag : "iframe", src : me.xfilename}
            }
        );
    }
});

Ext.onReady(function(){

    Ext.Ajax.request({
        url: 'data/apppdf.php?class=Export&action=composerCSV',
        method: 'POST',
        timeout: 1200000,
        params: {
            id: id
        },

        success: function (response, opts) {
            var r = Ext.JSON.decode(response.responseText);
            if (r.success == true) { 
                var win = Ext.create('Test.ReportWindow', {
                    xfilename: r.filename,
                    xtitle: 'Show PDF file'
                });
                win.show();
            } else {
                Ext.Msg.alert('Attention', r.errmsg);       
            };
        }
    });
}); 

Часть PHP:

<?
// Create and save file to disk. Return filename to ExtJS.
// Uncomment next line and generate PDF as you want.
/*
require('fpdf.php');

$filename = 'test.pdf';
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output('F', $filename);

// Exception or other way of error check:
if ($something_is_wrong) {
   echo "{
        success: false,
        errmsg: 'Something is wrong.'
   }";
   exit;
}
*/

echo "{
    success: true, 
    filename: '".addslashes($filename)."'
}";
?>

Примечания: протестировано с ExtJS 4.2.

0 голосов
/ 06 июня 2018

Один из способов сделать это - сохранить файл на вашем сервере, указав «F» в качестве первого аргумента в функции output ():

$folder = '../';
$dt = date('Y-m-d_H:i:s');
$pdf->Output("F", $folder . "rapport" . $dt);

return $folder . "rapport" . $dt;

Поскольку теперь вы знаете путь и имя файла, выможет вернуть эту строку и делать с ней все, что вы хотите в вашей функции успеха ajax.Обратите внимание, что сначала я сохраняю дату и время, потому что, возможно, время возврата не такое, как при создании имени файла.Посетите страницу вывода в документации для получения дополнительной информации: http://www.fpdf.org/en/doc/output.htm

Ваша функция успеха Ajax может выглядеть примерно так:

success: function (response, opts) {
    $('div.yourdiv').html(response);
}

Это заменит все html в div.yourdiv наответ из php файла.В этом случае ссылка на ваш файл.

Другой пример:

success: function (response, opts) {
    location.href = response;
}

Это перенаправит пользователя в файл после создания.

Это один из способовсделай это, я уверен, что это возможно без сохранения файлов.

...