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


How to set the filename of a file generated in PHP

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

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

  2. 我如何通过变量从报告。php报告。php?

有两个文件:

generaterreport .php创建报告

reports.php接收来自网页的请求并提供生成的下载文件

下面是我的代码:

在generaterreport .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返回一个包含两个元素的数组,第一个是文件名,第二个是数据:

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

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

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生成函数,使其返回一个包含数据和文件名的数组。

我不是100%清楚你的代码结构,但解决你的问题的基本元素是返回一个数组的想法,而不是从报告生成函数的字符串,其中数组的一个元素包含数据和其他元素包含文件名。

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

第一个是文件路径。除非应用程序的每个文件都在同一个文件夹中,包括临时文件(这将是一个非常糟糕的主意),否则您将希望传递回包含一些路径信息的文件名(例如。"临时/reportfiles/report3.pdf")。但是,当您在输出头中设置名称时,您将只需要文件名部分,例如。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));

我希望所有的帮助。祝你好运!