Сохранение файла, созданного скриптом AJAX - PullRequest
3 голосов
/ 21 марта 2012

Добрый вечер.

Я использую инфраструктуру Yii и библиотеку mPDF для создания некоторых файлов PDF с помощью сценария Ajax, и мне нужно принудительно установить диалог «сохранить как» в браузерах пользователей.

Я знаю, как решить эту проблему с помощью одного пользователя, загружающего один файл. У кого-нибудь есть совет, как заставить все это работать в системе с высокой нагрузкой (например, несколько пользователей, пытающихся сгенерировать и загрузить PDF, попытаются получить доступ к одному временному файлу, который может вызвать ошибку)?

Должен ли я генерировать отдельный файл для каждой сессии? И какой способ был бы хорош для очистки этих временных файлов?

Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 21 марта 2012

Сделайте невидимый фрейм. Из JS установите src этого iframe в скрипт на вашем сервере, который генерирует PDF.

 <iframe src="http://yoursite.com/download-file.php?report=pdf&param1=value1&param2=value2..." width="1" height="1"></iframe>

Тогда (и я не уверен, как вы делаете это с mPDF), смысл в том, чтобы вывести файл из скрипта прямо в браузер. Это примерно так:

 <?php 
     $x = some_function($_GET['param1'],$_GET['param2', ...); // PDF GEN. ROUTINE, BASED ON REQUEST DATA, HOWEVER YOU DO IT
     header('Content-type: application/pdf');
     echo $x;

Это должно решить все ваши проблемы.

1 голос
/ 21 марта 2012

Прежде всего, я бы порекомендовал вам создать отдельный временный файл для каждого сгенерированного PDF, чтобы избежать любой возможной ошибки, например, когда один пользователь загружает чужой PDF-файл и т. Д.

Для очисткивременный каталог, я бы использовал cronjob, который удаляет все файлы старше N дней.

Чтобы «принудительно сохранить диалог», вы должны установить заголовок Content-disposition на attachment:

header('Content-Disposition: attachment; filename="myfile.pdf"');
1 голос
/ 21 марта 2012

вы должны использовать tempnam http://www.php.net/manual/en/function.tempnam.php для генерации временных файлов.они будут иметь уникальное имя, поэтому их будет легко сделать по одному за сеанс.Просто удалите как обычно, когда вы закончите с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...