动态更改下载的文件名


Dynamically change the downloaded filename

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


编辑说明:根据意见,这个问题可以改写如下。

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

No code provided

参见评论:

  • 保持名称不变
  • 显示下载.xls
  • 基于月份
  • 服务器端

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

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

您编写

该excel表是使用Javascript从HTML表转换而来的。

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

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

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

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

这里也是一样:如果你在客户端转换它,而客户端的计算机内存中有这个文件,让他把它保存到磁盘上。不要强迫他上传整个文件以便下载…正如所说:Javascript的Math.random()可以让你产生一个随机数,你可以用来创建随机文件名。

编辑

基于OP评论中的问题:

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

要根据月份创建文件名,您可以使用Javascript的Date,如下所示:

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

如果你正在寻找如何在客户端存储文件的提示,你可能想深入了解:

  • 在客户端上保存生成的文件

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

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

编辑2:由于@Herbert的评论,删除了2个不必要的标题,纠正了上述示例)

如果你想要更多的替代解决方案,你可能想检查我在第一条评论中链接的两个问题的答案,因为你的问题是这些问题的潜在重复

  • "PHP动态更改文件名"
  • "PHP和下载Excel表"

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