Не удается сохранить PDF-файл URL-адреса блоба из Safari 12.1 на Mac - PullRequest
0 голосов
/ 13 апреля 2019

Я устанавливаю в iframe src URL-адрес большого двоичного объекта в формате "blob: http://localhost:3000/f87808a3-9a74-4d61-b7ae-7ac37ff38325".. В iframe отображается файл PDF, созданный с использованием некоторого javascript. Отображение этого PDF-файла работает должным образом во всех браузерах. В Chrome и Firefoxможно загрузить этот PDF-файл на жесткий диск с помощью встроенных в браузеры обозревателей PDF.

Однако в Safari 12.1 для Mac при нажатии кнопки загрузки средства просмотра PDF ничего не происходит.

Это известная ошибка в Safari?

Существуют ли способы заставить загрузки PDF-файлов BLOB-объектов работать в Safari?

1 Ответ

0 голосов
/ 06 мая 2019

Это связано с моим ответом здесь .

Очевидно, это ошибка Safari 12.1 , которая иногда происходит. Это не исправлено target = "_self", что относится к другому багу регрессии .

Пока ошибка не исправлена, уродливый обходной путь:

  1. Отправка большого двоичного объекта на сервер, который сохраняет файл удаленно.
  2. Скачать удаленный файл.

Код Javascript

   async createDownloadElementAndClick(blob, fileName) {
            let options = {
                method:"POST",
                body:blob
            };

            await fetch(`https://example.com/upload.php`, options);

            window.open(`https://example.com/download.php?${fileName}`, "_self");
    }

код PHP

In upload.php:

<?php    
// add any authentication code as necessary here


    // gets entire POST body
    $data = file_get_contents('php://input');

    $filename = "temp/download.pdf";
    // write the data out to the file
    $fp = fopen($filename, 'wb');

    fwrite($fp, $data);
    fclose($fp);
?>

В download.php:

<?php
    ob_start();
    $file = $_SERVER["QUERY_STRING"];

    // This is the line that tells Safari to download the file instead of opening it
    header("Content-disposition: attachment; filename=$file");
    header("Content-type: application/pdf", false);
    readfile("temp/download.pdf");

    ob_flush();
    // This deletes the pdf so there is little chance of contaminating the next call
    unlink("temp/download.pdf");
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...