AJAX + PHP + Скачать сгенерированный файл mPDF - PullRequest
0 голосов
/ 08 ноября 2018

Я создаю приложение, в котором у пользователя есть доступ для просмотра множества PDF, представленных ему в виде таблицы. В каждой строке также есть флажок, который позволяет пользователю проверять или не проверять следующее действие, которое я опишу позже.

Эти флажки находятся внутри тегов формы, и после этого есть кнопка отправки, которая отправляет ID всех файлов внутри массива методом POST через AJAX REQUEST в файл PHP.

Запрос AJAX выглядит следующим образом:

$.ajax({
    url: link,
    type: 'POST',
    data: $(this).serialize(),
    success: function(result) {

        if (result == 'ok') {

            if (redirect) {
                window.location.replace(redirect);
            } else {
                window.location.reload();
            }

        } else {

            if (callback) {
                $('#' + callback).html('<div>' + result + '</div>');
            } else {
                alert(result);
            }   

        }

    }
});

Так что ничего особенного, все данные поста взяты и отправлены в конкретный файл PHP.

Далее, на стороне файла PHP - есть алгоритм, который проверяет, есть ли у пользователя доступ ко всем файлам по полученным идентификаторам метода записи. Таким образом, есть простой цикл в сочетании с SQL-запросом.

Когда LOOP проверяет, что у него есть действительный доступ - я создаю один большой файл, состоящий из всех файлов, которые он выбирал по предыдущим флажкам. В этом случае я использую mPDF, и объединение файлов для меня не проблема.

Объединенный файл затем создается на сервере и имеет определенное имя.

А теперь - как я уже говорил, этот файл должен быть очень закрытым, поэтому после того, как пользователь загрузит его, я хочу, чтобы скрипт также удалил этот файл. Но я не могу справиться с частью загрузки.

Я пытался отправить заголовки со стороны PHP-файла, но он заканчивается, как будто странные символы выводятся в элемент div обратного вызова вместо отображения диалога загрузки.

Мой код для отправки заголовков выглядит ниже

$file = __PATH_TO_FILE__ . 'MaJjYzA4OGE4N2Q0MjUwNmJkZDQ0ZmZm.pdf'; //file which in fact exists

header('Content-type:  application/download'); //or event tried with application/pdf => no difference
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="'. $file .'"');
return readfile($file);

Для краткости, вместо диалогового окна + загрузка - странные символы закрывают область обратного вызова.

Если вы, ребята, знаете, что происходит и что я должен сделать в этом конкретном сценарии, я буду рад помощи. Кроме того, я буду более благодарен, если вы предложите мне, что делать с удалением файла после того, как пользователь загрузит его, или даже отмените диалоговое окно с приглашением, чтобы файл больше не оставался на сервере.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Это сработало для меня.

success: function(response) { i++; $('#buttonid').append('<a href="'+response+'" class="hiddenlink" download style="display:none"></a>'); if(i == 1){ $('.hiddenlink')[0].click(); } else { i=0; $('.hiddenlink').remove(); } }

0 голосов
/ 08 ноября 2018

Вам необходимо вернуть ссылку на ваш файл из ajax

$file = __PATH_TO_FILE__ . 'MaJjYzA4OGE4N2Q0MjUwNmJkZDQ0ZmZm.pdf'; //file which in fact exists
echo $file;

в вашем успехе ajax вы просто открываете новое окно для этого файла;

success: function(file) {
   window.open(file);
}

другое решение будет использовать скрытую ссылку для скачивания

  success: function(file) {
       $('body').append('<a href="'+file+'" class="hiddenLink" download style="display:none;"></a>');
      $('.hiddenLink').trigger('click');//or $('.hiddenLink')[0].click();
    }
...