【问题标题】:PhpSpreadsheet return file instead of saving itPhpSpreadsheet 返回文件而不是保存它
【发布时间】:2018-10-23 11:23:42
【问题描述】:

我已生成 xmlx 文件,我可以将其保存并通过以下方式提供给用户:

$writer->save('hello world.xlsx');
header('Location: hello world.xlsx');

但是,该文件仍保留在硬盘驱动器上。我需要摆脱它,因为它是一种安全威胁。

我尝试取消链接文件

unlink('hello world.xlsx');

但这会过早删除文件,因此用户无权访问它。 如果它可以与 unlink 一起使用,那么我需要确保文件将被删除(正确使用 die(); 等)

编辑: 它不再只是出于安全原因。提供程序不允许保存文件,因此这是唯一的方法。

【问题讨论】:

    标签: php phpspreadsheet


    【解决方案1】:

    您可以在创建文件后直接发送文件,而不是重定向到文件。

    $filename = 'hello world.xlsx';
    $writer->save($filename);
    
    // Set the content-type:
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Length: ' . filesize($filename));
    readfile($filename); // send file
    unlink($filename); // delete file
    exit;
    

    【讨论】:

    • 不幸的是,我发现在服务器上(与本地主机不同)禁止保存。
    【解决方案2】:

    使用php://output

    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="file.xls"');
    $writer->save("php://output");
    

    【讨论】:

    • 这不起作用,因为它返回页面上的内容而不是文件中的内容。所以它返回的是随机警告而不是文件。
    • @Brambor 那里的警告是什么?
    • 不相关的,它在它工作之前就在那里,Warning: date() expects parameter 2 to be integer, float given in "my_file_path"\vendor\phpoffice\phpspreadsheet\src\PhpSpreadsheet\Writer\Xlsx\DocProps.php on line 148
    • 你是对的。一旦所有警告都被抑制,文件就会显示得很好。典型的“如果你想使用标题,你必须不回显任何东西”错误。
    • 在末尾添加exit();,这样它就不会下载页面的其余部分
    【解决方案3】:

    调用 ob_end_clean();就在 $writer->save('php://output') 之前。

    ob_end_clean();
    $writer->save('php://output');

    【讨论】:

      【解决方案4】:

      您可以使用内存中的文件指针并从中读取。

      $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
      
      $fp = fopen("php://memory", "rw");
      $writer->save($fp);
      rewind($fp);
      
      $contents = "";
      while (!feof($fp)) {
          $contents .= fread($fp, 8000);
      }
      

      【讨论】:

        猜你喜欢
        • 2020-03-17
        • 1970-01-01
        • 2018-12-02
        • 2018-10-31
        • 1970-01-01
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多