Как вызвать диалоговое окно «Сохранить как» после создания документа Word с помощью Fopen и Fwirte в PHP

Я написал следующий скрипт, чтобы конечный пользователь мог создать текстовый документ из текста, введенного в текстовую область:

$fp = fopen("yourDoc.doc", 'w+');
fwrite($fp, $wordDoc);
fclose($fp);

По сути, создается файл «yourDoc.doc», а текст, записанный в файл, находится в переменной $wordDoc.

В настоящее время этот скрипт создает документ и автоматически сохраняет его по тому же пути, по которому расположены страницы моего сервера. Я хочу использовать приведенный выше сценарий, но вывести диалоговое окно «Сохранить как», чтобы конечный пользователь мог локально сохранить документ на своем компьютере.

После нескольких часов исследований я понял, что могу использовать заголовки, однако не могу заставить их работать. Кажется, я не могу найти пример, который включает в себя заголовки, fopen и fwrite. Например, я безуспешно пробовал множество вариантов следующего скрипта:

$fp = fopen("yourDoc.doc", 'w+');
fwrite($fp, $wordDoc);
fclose($fp);
header('Content-type: application/ms-word');
header('Content-disposition: attachment; filename="yourDoc.doc"');
readfile("yourDoc.doc");

Я также пробовал следующее (это вся моя php-страница):

<?php
//Connect to Db//
$con = mysql_connect("localhost", "root", "admin");
//Verify connection//
if (!$con)
{
  die('Could not connect: ' . mysql_error());
}
//Select Db//
mysql_select_db("schooldb", $con);
$wordDoc = $_GET['word'];//text for word doc//
header('Content-type: application/ms-word');
header('Content-disposition: attachement; filename="yourDoc.doc"');
$fp = fopen("yourDocument.doc", 'w+');//word doc created//
fwrite($fp, $wordDoc);//text written to word doc//
fpassthru($fp);
fclose($fp);
mysql_close($con);  
?>

Кто-нибудь видит что-то не так с этим? Файл попадает на мой сервер, и я не получаю диалоговое окно «Сохранить как».

Мне действительно нужна помощь в этом.

Спасибо,


person user175328    schedule 28.08.2011    source источник


Ответы (1)


Нет необходимости сначала записывать данные слова в файл:

header('Content-type: application/ms-word');
header('Content-disposition: attachment; filename="yourDoc.doc"');
echo $wordDoc;

тем не менее, вы должны убедиться, что никакого вывода не произошло, прежде чем выполнять вызовы header(). PHP НЕ будет отправлять заголовки, если произошел хотя бы один символ «вывода», и это не удастся.

person Marc B    schedule 28.08.2011
comment
Thnx Marc B. Я проверил отсутствие предыдущих выходов, выполнив событие создания файла на отдельной php-странице. Я попытался использовать только заголовки с уже помещенным в папку yourDoc.doc, но не могу получить приглашение Сохранить как. $wordDoc делает эхо соответственно. Я испробовал весь сценарий (то есть fopen, fwrite и заголовки), но файл по-прежнему сохранялся на сервере и не выводил диалоговое окно «Сохранить как». Есть ли у вас другие предложения? Нужно ли менять настройки на моем тестовом сервере (LAMP)? - person user175328; 28.08.2011
comment
Использование чего-то вроде FF Firebug/HTTPFox для просмотра заголовков, которые получает браузер - убедитесь, что заголовок диспозиции действительно проходит. Попробуйте другой браузер, чтобы сделать попытку загрузки. Кроме этого, без понятия. - person Marc B; 28.08.2011
comment
Спасибо еще раз, я наконец-то заставил его работать в FF. Я думаю, вы можете выполнить загрузку файла только с помощью href, а не только с помощью JS-функции onclick. Теперь мне нужно выполнить unlink(), чтобы стереть ошибочный файл, который автоматически сохраняется на сервере. К сожалению, Safari читает мой сценарий не так, как FF, поэтому Safari считает, что документ не существует из-за unlink(), тогда как FF получает документ до выполнения unlink(). Заставляет меня задуматься об IE... - person user175328; 29.08.2011