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.