Динамическое создание документа doc/docx на рабочем столе пользователя

Мой сайт представляет собой HTML/Javascript с AJAX, вызывающим PHP на стороне сервера. Я хочу, чтобы пользователь мог щелкнуть значок и создать отчет из данных MySQL, а затем сохранить его на рабочем столе клиента без перезагрузки страницы.

Варианты создания документа, насколько я могу его собрать, выглядят следующим образом. (Я понимаю, что это нужно делать на стороне сервера, а не с помощью Javascript.) Я не уверен, где файл заканчивается в каждом случае. Пожалуйста, не стесняйтесь исправить мои недоразумения :)

Способ 1 — появляется только для создания файла .doc. Я не уверен, куда помещается файл.

$fp = fopen("method1.doc", 'w+');
$str = "<B>This is the text for the word file created through php programming</B>";
fwrite($fp, $str);
fclose($fp);

Способ 2 — это также похоже на создание файла .doc.

$word = new COM("word.application") or die ("couldnt create an instance of word");
echo "loaded , word version{$word->version}";
$word->visible = 1;
$word->Documents->Add();
$word->Selection->TypeText("Sample text.");
$word->Documents[1]->SaveAs("method2.doc");
$word->Quit();
$word->Release();
$word = null;

Способ 3 - думаю, тоже файл .doc.

header('Content-type: application/vnd.ms-word');
header("Content-Disposition: attachment;Filename=method3.doc");

echo "<html>";
echo "<body>";
echo "<b>My first document</b>";
echo "</body>";
echo "</html>";

Способ 4 — PHPWord

Метод 5 — PHPDocx

Я протестировал 1 и 2 в своей домашней среде разработки, но не могу найти файлы! Как лучше поступить, пожалуйста?

Спасибо :)

Кстати, я знаю, что здесь есть соответствующие сообщения , здесь и здесь, но на самом деле никто не отвечает на вопрос.


person Nick    schedule 12.03.2012    source источник
comment
При первой и второй попытке файл сохраняется на сервере, а не отправляется клиенту. Если вам нужно, чтобы клиент сохранил файл, вы должны вывести сгенерированный контент и установить правильные заголовки ответов, как в вашем третьем примере (хотя это не совсем сгенерирует правильный документ Word).   -  person Another Code    schedule 12.03.2012


Ответы (2)


Методы 1 и 2 создают документ на стороне сервера где-то в файловой системе (после этого вам нужно передать его клиенту).

Способ 3 создает документ в ответ на запрос клиента - в зависимости от настроек браузер либо сохранит его, либо откроет в окне (или спросит "Сохранить/Открыть/Отменить?").

Лично я бы сделал java-апплет или флеш-приложение, которое будет иметь доступ к вашей локальной файловой системе. Он может загружать документ с сервера и сохранять в локальную файловую систему без перезагрузки страницы.

person Victor    schedule 12.03.2012

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

Пример :

header ('Pragma: no-cache');
header('Content-Disposition: attachment; filename="'.$File.'"');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: public');
header('Content-Description: File Transfer'); 
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.$Len);

При этом загрузка начнется, но страница, на которую щелкнул пользователь, не изменится и не перезагрузится.

Если вы хотите создавать динамические файлы DOCX для загрузки, я рекомендую использовать OpenTBS. Эта библиотека может генерировать DOCX (и XLSX, PPTX, ODT, ODS, ...) с использованием шаблонов. Он имеет функцию, которая позволяет отправить результат напрямую в виде загрузки, без временных файлов, или позволяет сохранить его на стороне сервера.

person Skrol29    schedule 26.03.2012