JQuery Ajax для загрузки PDF файлов
Мой вопрос похож на Загрузить и открыть pdf файл с помощью Ajax
Но не совсем то же самое, причина, по которой я хочу использовать JQuery ajax, заключается в том, что мой файл генерируется динамически из данных, которые будут извлекаться с той же страницы.
Итак, в основном у меня есть Json Object, который нужно отправить на сервер, который будет динамически генерировать файл и отправлять его обратно в браузер.
Я бы не хотел использовать строки запроса на якоре с моим объектом Json stringyfied,
как я думаю, это потенциальная угроза, поскольку строки запросов имеют ограничения характера (я здесь?).
Пожалуйста, дайте мне знать Если мой рабочий процесс прав, или я могу достичь того же, используя другой поток.
Ответы
Ответ 1
Вы не должны использовать AJAX для загрузки файлов. Это не работает. При этом у вас осталось 2 варианта:
-
параметры ссылки на действие и строку запроса или если загрузка должна быть тригеровой на каком-либо конкретном событии javascript, вы также можете установить window.location.href
на действие, которое должно генерировать PDF файл, и передать ему параметры строки запроса.
-
или если вы боитесь, что у вас есть много данных для передачи действий контроллера, которые будут генерировать PDF файл для загрузки, вы используете <form>
с method="POST"
, а внутри вы используете скрытые поля для хранения параметры и данные по вашему усмотрению:
@using (Html.BeginForm("download", "home"))
{
... hidden fields containing values that need to be sent to the server
<input type="submit" value="Download PDF" />
}
Ответ 2
Вместо того, чтобы сделать еще один вызов ajax на вашей странице, вы можете использовать привязку и загрузку php force для выполнения загрузки pdf
HTML
<a href="www.example.com/download_file.php?file_source=example.pdf">Download pdf here</a>
PHP
<?php
$fullPath = $_GET['fileSource'];
if($fullPath) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
header("Content-type: application/pdf"); // add here more headers for diff. extensions
break;
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
}
if($fsize) {//checking if file size exist
header("Content-length: $fsize");
}
readfile($fullPath);
exit;
}
?>
Я проверяю размер файла, потому что, если вы загружаете PDF из облачного облака CDN, вы не получите размер документа, который заставляет документ загружаться в 0kb. Чтобы этого избежать, я проверяю это условие.
if($fsize) {//checking if file size exist
header("Content-length: $fsize");
}
Я тоже боролся с этой проблемой, над кодом работал у меня, я надеюсь, что это поможет
Ответ 3
У меня есть очень верный ответ. Вы не можете загрузить файл PDF при использовании запроса ajax на сервер. Поэтому вместо этого вы должны использовать html actionlink. например
@Html.ActionLink("Convert Data into PDF", "PDFView", null, new { @class= "btn btn-info" });
Над кодом будет создана кнопка ссылки, и вы можете получить доступ к методу действий контроллера. Также вы можете использовать любую технику для возврата файла PDF с контроллера, например, вы можете вернуть PDF файл с помощью класса FileResult
.