【问题标题】:What is the correct syntax for defining filename with variables?用变量定义文件名的正确语法是什么?
【发布时间】:2015-04-21 13:52:25
【问题描述】:

关于下载文件和定义标题,我无法为我的文件分配动态filename。使用以下代码时:

header("Content-Disposition: attachment; filename=test.csv");

会生成一个test.csv 文件以供下载。但是,如果我使用这个:

header('Content-Disposition: attachment; filename=' . $filename . '.csv');

它会生成一个.php 文件。使用此方法也不会将Content-Dispositionfilename 传递给标头。

完整代码:

session_start();
    $file =$_SESSION['csvf'];
    $filename = $file."_".date("Y-m-d_H-i",time());
    header ( "Content-type: text/csv" );
    header("Content-Disposition: attachment; filename=test.csv");
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    print($file);
    exit ();

正确的语法是什么?

编辑

建议后的工作代码

session_start ();
$file = $_SESSION ['csvf'];
$filename =date ( "Y-m-d_H-i", time () );
header ( "Content-type: text/csv" );
header ( "Content-Disposition: attachment; filename=".$filename );
header ( 'Expires: 0' );
header ( 'Cache-Control: must-revalidate' );
header ( 'Pragma: public' );
header ( 'Content-Length: ' . filesize ( $file ) );
print ($file) ;
exit ();

【问题讨论】:

  • var_dump 你的 $filename 变量,看看它包含什么......你可能还想修剪它以尾随 "'
  • 实际文件在哪里?我还看到您使用filesize($file) 并同时使用$file$filename,这对我来说没有多大意义,请澄清。
  • @PedroLobito Ye,严重错误我从$filename 中删除了$file
  • @AresDraguna 谢谢。

标签: php http-headers filenames


【解决方案1】:

我没有看到您的代码中指定的example.csv 的路径,您需要提供$file 的完整路径,即:

$mySession = $_SESSION['csvf'];
//since $_SESSION['csvf'] contains the actual data you cannot use it for filename
$filename = date("Y-m-d_H-i",time()).".csv"; 
//write $mySession contents to file. Make sure this folder is writable
file_put_contents("/home/site/csvfolder/$filename", $mySession); 
$file = "/home/site/csvfolder/$filename";

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-type: text/csv');
    header('Content-Disposition: attachment; filename='.$filename);
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}

【讨论】:

  • 如果我的$mySession 包含我要打印到CSV 文件的数据怎么办?
  • 因为您根本无法将$mySession 的内容转储到浏览器并期望它了解您的尝试。如果您有疑问,可以查看function.readfile.php
  • @b0w3rb0w3r 如果你的问题充满了错误的答案,你必须专注于如何以一种实际的方式实现你想要的,让它发挥作用并继续下一个任务。
  • 我刚刚意识到你正在使用readfile() 我正在使用print()
  • 使用其中一个有什么好处吗?
【解决方案2】:

请按如下方式使用,我正在使用它。

        header("Content-Type:   application/vnd.ms-excel; charset=utf-8");
        header("Content-Disposition: attachment; filename=".$fileName);  
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

使用您的文件格式代替application/vnd.ms-excel。它适用于Microsoft Excel。

【讨论】:

  • 我使用application/vnd.ms-excel有问题所以我改成text/csv
  • 是的,使用 text/csv 并尝试。
  • 我只是测试 text/csv 和 application/csv 都可以工作。您可以使用以下代码作为参考。如果它对你有用,永远不要忘记接受它。:-)
【解决方案3】:

试试这个:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=test.csv');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;

您可以在此处查看有关使用 PHP 下载文件的更多信息:

http://php.net/manual/en/function.readfile.php

【讨论】:

    【解决方案4】:

    试试下面的代码,它对我有用

    $file =$_SESSION['csvf'];
    $filename = $file."_".date("Y-m-d_H-i",time()).".csv";
    header ( "Content-type: text/csv" );
    header("Content-Disposition: attachment; filename=".$filename);
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    print($file);
    exit ();
    

    【讨论】:

    • 为什么 OP 会尝试这样做?解释在哪里?
    • @PedroLobito 如果您是聪明的 PHP 编码员,则无需对这个简单的更改进行任何解释。!!无论如何感谢您的评论。
    • @HardikBhavsar 我可以回答你,但我的时间有点宝贵,可以这样节省。
    • 不需要在文件名中添加.csv,因为内容类型是csv。问题是$filename 中的$file 生成的字符串对于名称来说太大了。
    • @b0w3rb0w3r ,你能告诉我们 $filename 这里吗?多久了?
    【解决方案5】:

    下面是一个 .zip 文件的 sn-p 文件,其中包含一些关于 header 所需信息的描述,也许一个好的做法是在编写 header 之前获取信息和一些验证。 还包括另一个较短的示例,

    // defines filename, type, path, size and a reference to file (handler)
    // to set as values for file header
    $filename = $survey_id . '.zip';
    
    // define path to the file to be get file size on the next line
    $filepath = [path to file]. '/' . $filename;
    
    // used by 'Content-length'
    $filesize = filesize($filepath);
    
    // using fopen to get a file handler, 'r' for read, 'b' for binary (zip file)
    $file_pointer = fopen($filepath, 'rb'); 
    
    // check if file exists
    if(is_file($filepath))
    {
      // valid file?
      if($filesize && $file_pointer)
      {
          // some required header information to describe file, see [docs][1]
          header("Pragma: public");
          header("Expires: 0");
          header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
          header("Cache-Control: public");
          header("Content-Description: zip file");
          header("Content-Type: application/zip");
          header("Content-Type: application/force-download");
          header("Content-Disposition: attachment; filename=" . $filename);
          header("Content-Transfer-Encoding: binary");
          header("Content-length: " . $filesize);
          fpassthru($file_pointer); 
    
          // close 
          fclose($file_pointer);
        }
    }
    

    另外,结帐readfile(),下面是一个较短的sn-p

    <?php
     $file = 'monkey.gif';
    
     if (file_exists($file)) {
       header('Content-Description: File Transfer');
       header('Content-Type: application/octet-stream');
       header('Content-Disposition: attachment;    filename='.basename($file));
       header('Expires: 0');
       header('Cache-Control: must-revalidate');
       header('Pragma: public');
       header('Content-Length: ' . filesize($file));
       readfile($file);
       exit;
    }
    

    ?>

    希望这会有所帮助!

    【讨论】:

      【解决方案6】:

      像这样正确地转义你的 php:

      header('Content-Disposition: attachment; filename=' . time() . '.export.csv');
      

      此示例将在文件名前添加一个 UNIX 时间戳。当然,您可能会对以编程方式使用变量或内置 php 函数感到疯狂,但这只是示例。

      这里有更多的例子。运行此 php 代码时将生成此文件名。 2019-05-18-contacts-main-export-by-Garrick.csv

      header('Content-Disposition: attachment; filename=' . date("Y-m-d") . '-contacts-main-export-by-' . $uidName . '.csv');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 2016-12-07
        • 2020-11-22
        • 1970-01-01
        • 2013-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多