после двух дней чтения и поиска решений и других возможных способов я наконец-то убедил себя попросить о помощи здесь. Многие люди задавали подобные вопросы, я использовал ВСЕ их решения, и многие из них помогли до этого момента. Я полностью застрял в этой точке.
К моей проблеме: я хочу загрузить pdf-файлы в каталог хранилища, а затем сделать их доступными для пользователей, нажимающих на простую кнопку (используя jquery ajax post request). Загрузка работает нормально, и PDF оказывается в правильном каталоге, как гласит заголовок, возвращая файл, работает хорошо, но вместо отображения pdf в браузере он просто возвращает для большинства частей странно закодированную строку, начиная со следующего:
% PDF-1.3
% ÂãÏÓ
Мой код jQuery:
$('input.btn-pdf').click(function () {
event.preventDefault();
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$.ajax({
url: '/big-picture/getPDF',
type: 'POST',
data: {'filename':$(this).val()},
success: function (data) {
}
});
});
После нажатия кнопки в качестве пользователя файлы PDF не должны загружаться немедленно, поэтому я обратился к документации Laravel (5.6) и использовал соответствующий метод ответа, как указано ниже, в моем контроллере:
public function getPDF(Request $request)
{
$headers = [
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, PATCH, DELETE',
'Access-Control-Allow-Headers' => 'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization , Access-Control-Request-Headers',
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline'
];
return response()->file(storage_path("app\pdfs\\".$request->filename), $headers);
}
Как я уже сказал, он находит файл, и я не получаю никаких ошибок (код состояния 200). Я не смог найти никакой информации о том, что мне нужно что-либо делать в представлении или в области успеха моего вызова jjery ajax после возврата файла в качестве ответа, чтобы правильно его отобразить. Я также проверил тип файла, прежде чем вернуть его, и он правильно сказал 'application / pdf'. Сначала я получил много сообщений об ошибках, а потом обнаружил, что для правильной работы нужно использовать правильные заголовки, что я и сделал. Теперь это должно работать, но это не так.
Это заголовок ответа:
Диапазон принятия: нет
Access-Control-Allow-Headers: Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, Тип контента, Access-Control-Request-Method, Авторизация, Access-Control- Запрос-заголовки
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE
Access-Control-Allow-Origin: *
Cache-Control: public
Соединение: закрыть
Content-Disposition: встроенный
Длина содержимого: 1650653
Тип содержимого: application / pdf
Дата: Пт, 31 августа 2018 09:51:04 GMT
Дата: Пт, 31 августа 2018 09:51:04 +0000
Хост: localhost: 8000
Дата последнего изменения: чт, 30 августа 2018 г. 09:30:39 GMT
Set-Cookie: XSRF-TOKEN = aLongTokenHere; истекает = пт, 31 августа 2018 11:51:04 по Гринвичу; Max-Age = 7200; Путь = /
Set-Cookie: laravel_session = aLongSessionIdHere; истекает = пт, 31 августа 2018 11:51:04 по Гринвичу; Max-Age = 7200; Путь = /; HttpOnly
X-Powered-By: PHP / 7.2.4
Заранее спасибо. Меня интересует не только решение этой проблемы, но если у кого-то есть иное представление о плавном и интеллектуальном хранении PDF-файлов для моего конкретного случая использования и их возврате / отображении, я более чем готов изменить свой способ сделать это.
Всем вам хорошего дня.