如何设置 PHP 中生成的文件的文件名

How to set the filename of a file generated in PHP

一个新手问题 – 我需要将在 PHP(具体为 tcpdf)中生成的文件的文件名设置为变量 $number。目前,我已经将其编写为每次都放置相同的文件名。

  1. 如何将下载的文件名设置为generatereport.php中设置的变量?

  2. 如何将变量从 reports.php 传递到 report.php?

我有两个文件:

generatereport.php 创建报告

reports.php 从网页获取请求并提供生成的文件供下载

这是我的代码:

在 generatereport.php 中,这是使用 tcpdf 生成文件的内容

$string = $pdf->Output(’Site '.$number.' '.$date.'.pdf', 'S');
return $string;

在report.php中:

   function downloadFile($data,$name) {
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Disposition: attachment; filename=$name");
        header("Content-Type: mime/type");
        header("Content-Transfer-Encoding: binary");
        // UPDATE: Add the below line to show file size during download.
        header('Content-Length: ' . strlen($data));
        echo $data;
    }    


    if (isset($_GET['reportType'])) {
        switch ($_GET['reportType']) {
            case 'report3':
                downloadFile(reports::report3($_GET['id']),"report.pdf");
                break;
 case 'report1':
                downloadFile(reports::xlsReport1($_GET['id']),"report1.xlsx");
                break;
        }
    }

谢谢!

你可以试试这样的...

generatereport.php改为return一个有两个元素的数组,第一个是文件名,第二个是数据:

$filename = 'Site '.$number.' '.$date.'.pdf';
$string = $pdf->Output($filename, 'S');
return array($string, $filename);

然后修改 report.php 中的第二段代码来处理新的 return 类型:

if (isset($_GET['reportType'])) {
    switch ($_GET['reportType']) {
        case 'report3':
            list($data, $filename) = reports::report3($_GET['id']); 
            downloadFile($data, $filename);
            break;
        case 'report1':
            list($data, $filename) = reports::xlsReport1($_GET['id']);
            downloadFile($data, $filename);
            break;
    }
}

这假设您将 XLS 生成函数更改为 return 一个包含数据和文件名的数组。

我不是 100% 清楚你的代码结构,但解决你的问题的基本要素是 returning 一个数组而不是来自报告生成函数的字符串,其中一个元素数组的 包含数据,另一个元素包含文件名。

在处理过这类问题一百万次之后,我还可以提出另外两个可能需要改进的地方。

第一个是文件路径。除非你的应用程序的每个文件都在同一个文件夹中,包括临时文件(这将是一个非常糟糕的主意),否则你将要传回一个包含一些路径信息的文件名(例如 'temp/reportfiles/report3.pdf' ).但是,当您在输出 header 中设置名称时,您将只需要文件名部分,例如。 report3.pdf。因此,您可能希望按如下方式更改 downloadFile() 方法中的那一行代码:

   header("Content-Disposition: attachment; filename=" . basename($name));

最后,当您设置MIME类型时,您需要将其设置为实际类型。有很多方法可以确定 MIME 类型,但我倾向于使用以下辅助函数:

function getMimeType( $filename )
{
    switch( pathinfo( $filename, PATHINFO_EXTENSION ))
    {
        case 'csv':
            return 'text/csv';

        case 'pptx':
            return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';

        case 'pdf':
            return 'application/pdf';

        case 'xls':
            return 'application/vnd.ms-excel';

        case 'png':
        case 'jpg':
        case 'jpeg':
        case 'gif':
            return 'application/image';

        case 'zip':
            return 'application/zip';

        default:
            return 'application/octet-stream';
    }
}

您需要更改 downloadFile() 中的以下行才能使用此功能:

    header("Content-Type: " . getMimeType($name));

希望对大家有所帮助。祝你编码顺利!