如何设置在PHP

时间:2015-07-29 05:19:13

标签: php tcpdf

一个新问题 - 我需要将PHP生成的文件(特定于tcpdf)的文件名设置为变量$ number。目前我已将其写入每次都使用相同的文件名。

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

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

  3. 我有两个文件:

    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;
            }
        }
    

    谢谢!

1 个答案:

答案 0 :(得分:2)

你可以试试这样的......

更改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%清楚你的代码结构,但解决你的问题的基本要素是从报告生成函数返回数组而不是字符串的想法,其中数组的一个元素包含data和另一个元素包含文件名。

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

第一个是文件路径。除非您的应用程序的每个文件都在同一个文件夹中,包括临时文件(这可能是一个非常糟糕的主意),否则您将要传回包含一些路径信息的文件名(例如,' temp /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));

我希望一切都有所帮助。祝你的编码好运!