Я создаю приложение, в котором у пользователя есть доступ к просмотру множества 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);
Для краткости вместо диалогового окна + загрузка — странные символы покрывают область обратного вызова.
Если вы, ребята, знаете, что происходит и что я должен сделать в этом конкретном сценарии, я буду рад помощи. Кроме того, я буду более благодарен, если вы предложите мне, что делать с удалением файла после того, как пользователь загрузит его, или даже отмените диалоговое окно с приглашением, чтобы файл больше не оставался на сервере.
Вам нужно вернуть ссылку на ваш файл из 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();
}
Это сработало для меня.
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();
}
}