如何设置 PHP 中生成的文件的文件名
How to set the filename of a file generated in PHP
一个新手问题 – 我需要将在 PHP(具体为 tcpdf)中生成的文件的文件名设置为变量 $number。目前,我已经将其编写为每次都放置相同的文件名。
如何将下载的文件名设置为generatereport.php中设置的变量?
如何将变量从 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));
希望对大家有所帮助。祝你编码顺利!
一个新手问题 – 我需要将在 PHP(具体为 tcpdf)中生成的文件的文件名设置为变量 $number。目前,我已经将其编写为每次都放置相同的文件名。
如何将下载的文件名设置为generatereport.php中设置的变量?
如何将变量从 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));
希望对大家有所帮助。祝你编码顺利!