【问题标题】:Dynamically change the downloaded filename [closed]动态更改下载的文件名[关闭]
【发布时间】:2013-07-26 08:20:19
【问题描述】:

如何使用 php 动态更改下载的文件名?此 Excel 表是使用 Javascript 从 HTML 表转换而来的。现在我想在每次下载时动态更改文件名。我使用input 类型按钮作为下载按钮。


编者注: 基于cmets,这个问题可以改写如下。

我希望人们能够从服务器下载 Excel 表格。如何强制下载文件并根据月份设置文件名?当我下载文件时,它显示“download.xls”

No code provided

见 cmets:

【问题讨论】:

  • 你用什么代码下载文件?
  • 另外,您是要更改服务器上的文件名还是保持服务器上的文件名不变但更改下载文件的名称?
  • 是的,我希望服务器上的文件名保持不变
  • 标记为“不清楚你在问什么”
  • @e-sushi:我同意。

标签: php download


【解决方案1】:

将生成的文件名应用到 Content-Disposition 标头。

header("Content-Disposition: attachment; filename=\"$random_filename\"");
header('Content-type: application/vnd.ms-excel');
readfile($actual_filename);

【讨论】:

    【解决方案2】:

    你写

    此 Excel 工作表是使用 Javascript 从 HTML 表格转换而来的。

    这意味着 HTML 表格在客户端已经可以作为 EXCEL 文件使用。

    如果是这样,没有理由将转换后的 EXCEL 文件从客户端推送回服务器,以便客户端可以再次从服务器下载。那没有意义,并且在无用的循环上浪费带宽。

    换句话说:当 EXCEL 文件已经驻留在客户端的 Javascript 内存中时,您需要做的就是将您的(Javascript 转换的)EXCEL 文件存储为基于 Javascript 的Math.random() 之类的文件名。至于一种简单的文件保存方法,HTML5 的文件保存功能(作为许多方法之一)可能会成为您最好的朋友。

    想一想:如果您坐在家里的沙发上,您不会开车上班只是为了能够开车回家并从家里厨房的冰箱里拿啤酒,对吗?对,你就呆在家里,走进厨房去拿啤酒。 ;)

    这里也一样:如果你在客户端转换它并且客户端在他的计算机内存中有文件,让他将它保存到他的磁盘上。不要强迫他上传整个文件以便他可以下载它……如前所述:Javascript 的 Math.random() 使您能够生成一个随机数,您可以使用它来创建随机文件名。

    编辑

    基于OP's question in comment:

    但是如何根据月份以动态文件名保存这些下载的文件。

    要根据月份创建文件名,您可以像这样使用 Javascript 的日期:

    var now = new Date(); 
    var month = now.getMonth();
    

    如果您正在寻找有关如何在客户端存储文件的提示,您可能需要深入了解:

    如果您想在服务器端处理它并使用 PHP 将文件推送到客户端,并使用您自己的文件名(基于 year-month-day),您可以这样:

    <?php
    $realname = './data.xls';
    if (file_exists($realname )) 
    {
        $randname = 'YourExcelFilename'.gmdate('Y-m-d').'.xls';
        header('Content-type: application/vnd.ms-excel'); 
        header('Content-Disposition: attachment; filename='.$randname);
        header('Content-Length: '.filesize($realname));
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        ob_clean();
        flush();
        readfile($file);
    }
    exit();
    ?>
    

    EDIT 2:通过删除2个不必要的标头thanks to a comment by @Herbert更正了上面的示例)

    如果您想要更多替代解决方案,您可能需要查看the two questions I linked in my first comment 的答案,因为您的问题是这些问题的可能重复

    【讨论】:

    • 但是如何根据月份以动态文件名保存这些下载的文件。
    • 当我下载文件时,它会显示 download.xls
    • @rahul 查看我的编辑。如果您的文件现在显示 download.xls,您只需使用在我的 EDIT 示例中看到的 month var 重命名它。
    • 没有,我已经正确下载了excel文件,但是我无法根据月份更改下载文件的文件名。
    • 显然 OP 没有阅读我的答案。 :P 无论如何,根据this guy,HTTP 中不存在“Content-Description”和“Content-Transfer-Encoding”。
    【解决方案3】:

    你可以用PHP的重命名函数http://php.net/manual/en/function.rename.php重命名服务器上的文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多