Вывод в файл - потом на экран

docent28

Новичок
Добрый день!

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

У меня сейчас выводится диалоговое окно "Сохранить как..." Но вторая строка тоже пишется в файл. Не могу понять, что нужно сделать.

написал следующий код:
PHP:
<?php 
header('Content-type: text/plain'); 
header('Content-Disposition: attachment; filename="downloaded.txt"'); 
echo(" Строка для файла ");

ob_end_flush();

echo(" Строка для браузера ");
?>
 

hell0w0rd

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

hell0w0rd

Продвинутый новичок
docent28
PHP:
<?php

$action = isset($_GET['action']) ? $_GET['action'] : 'text';

switch($action) {
    case 'text':
        echo 'Строка для браузера';
        break;
    case 'file':
        header('Content-type: text/plain');
        header('Content-Disposition: attachment; filename="downloaded.txt"');
        echo(" Строка для файла ");
        break;
    default:
        header('HTTP/1.0 404 Not Found');
}
 

docent28

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

hell0w0rd

Продвинутый новичок
docent28
этого сделать невозможно.
Чтобы это было возможно - познакомьтесь с ajax
 

docent28

Новичок
Понятно. Плохо - конечно. Будем знакомиться с AJAX. Непонятно тогда, почему при закрытии указателя на файл - файл все равно позволяет записывать в себя данные? То есть я делал еще и так

PHP:
$fp = fopen('email-absent.txt', 'w');
    $file_name="email-absent.txt";
    header("Content-Length: ".filesize($file_name));
    header("Content-Disposition: attachment; filename=".$file_name); 
    header("Content-Type: application/x-force-download; name=\"".$file_name."\"");
    readfile($file_name); 

 echo(" Строка для файла ");

fclose($fp);

echo 'Строка для браузера';
В этом случае тоже все писалось в файл
 

hell0w0rd

Продвинутый новичок
http://phpfaq.ru/na_tanke - ознакомьтесь)
В кратце - файл, это лишь то как интерпритирует браузер ваш ответ. В действительности вы в этом коде делаете следующее:
открываете файл на сервере
расставляете заголовки ответа
считываете файл который только что открыли, причем никак это не относится к тому что вы его до этого открыли
выводите еще строку в конец ответа
закрывете файл
выводите еще одну строку в конец ответа

В итоге браузер видит ответ и видит заголовки. Понимает что это надо преобразовать в файл и предложить пользователю его закачать:)
 

docent28

Новичок
Спасибо за ссылку :) Читал я когда то это. Но я же закрыл файл - почему в него все равно записалось? Я вот этого не понял. Заголовки я другие уже не напишу, т.к. был вывод и любой header после echo даст нам ошибку.
Про readfile согласен. Здесь он не нужен. Просто убирал строки лишние, эту не убрал :)
Будем думать дальше. Все равно надо как-то сообщить пользователю, что файл сохранился и продолжить работу дальше
 

hell0w0rd

Продвинутый новичок
docent28
перечитайте что я написал выше, вы закрыли файл на сервере браузеру вы отдаете ответ. Все!
Чтобы это понять, попробуйте открыть консоль и написать что-то такое
PHP:
curl -v mysite.ru/path/to/load/file
Адрес собственно заменить, вы увидите свои заголовки и тело ответа
Например для гугла это что-то такое:
PHP:
$ curl -v google.com
* About to connect() to google.com port 80 (#0)
*   Trying 77.37.250.221...
* connected
* Connected to google.com (77.37.250.221) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Sat, 08 Jun 2013 14:24:41 GMT
< Expires: Mon, 08 Jul 2013 14:24:41 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact
* Closing connection #0
тк мы обратились к гуглу без www он просит нас обратиться к www.google.com
 

docent28

Новичок
Хорошо. Спасибо. Будем читать мануалы дальше. Получится - выложу ответ в данной ветке.
 
Сверху