【问题标题】:How to collect file and save on server with PHP如何使用 PHP 收集文件并保存在服务器上
【发布时间】:2013-06-20 11:07:12
【问题描述】:

我知道以前有人问过这个类似的问题,但我找不到针对我的具体问题的解决方案。 我有这段代码,它保存到一个文件中,并在从浏览器运行时立即下载到桌面。但我需要将其保存在服务器上。如何使用此特定代码执行此操作?

我需要将文件保存到变量中吗? $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();

?>  

【问题讨论】:

标签: php file


【解决方案1】:

这是一些正常的代码:

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

已执行,其行为与我们预期的一样:

% php output.php 
hey F4LLCON!

现在我将对其进行修改以添加输出缓冲并保存到文件并写入标准输出(使用常规的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 文件中的输出等于我们之前在 stdout 上得到的(现在仍然得到):

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);
?>

我们不会将所有内容都存储在一个巨大的缓冲区中,我们仍然可以同时输出到文件标准输出。

如果您不了解生成器,这里有一个解决方案,我们将回调“打印”函数传递给 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);
?>

【讨论】:

  • 所以我可以将$main = function() { 放在我的代码之前和}; $f = fopen("/tmp/catched2.txt", "wb"); foreach ($main() as $chunk) fwrite($f, $chunk); fclose($f); echo $output; 之后?它给了我一个语法错误。我可以在现有代码中使用您的方法吗?
  • 只有在您使用 PHP 5.5 并且在全局范围内没有 return 时才能这样做(希望您没有)。如果您想要一个几乎可以肯定适用于您所拥有的解决方案,请使用第一个(使用ob_start)。阅读有关输出缓冲的 PHP 文档:php.net/ob_start
  • 太棒了!它将文件保存到我的服务器,但最后一件事,我如何指定它保存文件的目录? (使用 ob_start();)
  • 调整传递给file_put_contents的路径。请尝试理解代码,它并不复杂。所有功能都记录在php.net
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多