2013-06-20 2 views
-1

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

Нужно ли сохранять файл в переменной, например. $files первый?

<?php 


header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Disposition: attachment;filename=export_".date('n-j-Y').".xls "); 
header("Content-Transfer-Encoding: binary "); 

exit(); 

?> 
+0

чек из [ 'file_put_contents'] (http://php.net/file_put_contents) – Dale

+0

@Dale Я читал, но не могу понять .. Можете ли вы мне помочь? – MOTIVECODEX

ответ

2

Вот некоторый нормальный код:

<?php 
echo "hey F4LLCON!"; 
?> 

Выполненная, он ведет себя так, как мы ожидаем:

% php output.php 
hey F4LLCON! 

Теперь я изменю его, чтобы добавить буферизацию и сохранить в файл и напишите на stdout (используя обычные звонки echo!):

<?php 
ob_start(); 
echo "hey F4LLCON!"; 
$output_so_far = ob_get_contents(); 
ob_clean(); 
file_put_contents("/tmp/catched.txt", $output_so_far); 
echo $output_so_far; 
?> 

После выполнения, вывод в файл catched.txt равно, что мы получили ранее (и до сих пор получить) на стандартный вывод:

hey F4LLCON! 

Теперь я изменить его снова, чтобы показать, как генераторы PHP 5.5 обеспечит вам с элегантным решением, которое не нужно жертвовать производительность (предыдущее решение требует, чтобы сохранить все промежуточные содержания в один гигантском выходном буфере):

<?php 
$main = function() { 
    yield "hey F4LLCON!"; 
}; 
$f = fopen("/tmp/catched2.txt", "wb"); 
foreach ($main() as $chunk) { fwrite($f, $chunk); echo $chunk; } 
fclose($f); 
?> 

Мы не хранящие все в одном гигантском буфере, и мы все равно можем выводить в файл и одновременно.

Если вы не понимаете генераторы, вот решение, в котором мы передаем функцию обратного вызова «print» на main(), и эта функция используется каждый раз, когда мы хотим выводить (только один раз здесь).

<?php 
$main = function($print_func) { 
    $print_func("hey F4LLCON!"); 
}; 
$f = fopen("/tmp/catched3.txt", "wb"); 
$main(function($output) use ($f) { 
    fwrite($f, $output); 
    echo $output; 
}); 
fclose($f); 
?> 
+0

Поэтому я могу разместить '$ main = function() {' before и '}; $ f = fopen ("/ tmp/catched2.txt", "wb"); foreach ($ main() as $ chunk) fwrite ($ f, $ chunk); fclose ($ f); echo $ output; 'после моего кода? Это дает мне синтаксическую ошибку. Могу ли я использовать ваш метод с моим существующим кодом? – MOTIVECODEX

+1

Вы могли бы это сделать, если бы использовали PHP 5.5 и не имели «return» в глобальной области (надеюсь, вы этого не сделаете). Если вам нужно решение, которое почти наверняка работает с тем, что у вас есть, используйте первый (с 'ob_start'). Прочитайте документы PHP по буферизации вывода: http://php.net/ob_start –

+0

Удивительно, что это сработало! Он сохраняет файл на моем сервере, но последнее, как я могу указать каталог, в котором он сохраняет файл? (с ob_start();) – MOTIVECODEX

Смежные вопросы