如何使用php脚本下载特定文件(csv)
我从一个php脚本生成一份每日报告,它位于一个文件夹中,如下所示如何使用php脚本下载特定文件(csv),php,csv,download,Php,Csv,Download,我从一个php脚本生成一份每日报告,它位于一个文件夹中,如下所示 report_2015_02_15.csv report_2015_02_16.csv report_2015_02_17.csv report_2015_02_18.csv report_2015_02_19.csv 我会给我的用户发送一封包含下载链接的电子邮件,一旦他们点击下载链接,下载脚本就会触发并准备下载。它当前将所有文件放入一个数组中,对其进行排序并查找最新的下载文件 这种方法有一个流程,即使你打开一封两周前的电子邮件
report_2015_02_15.csv
report_2015_02_16.csv
report_2015_02_17.csv
report_2015_02_18.csv
report_2015_02_19.csv
我会给我的用户发送一封包含下载链接的电子邮件,一旦他们点击下载链接,下载脚本就会触发并准备下载。它当前将所有文件放入一个数组中,对其进行排序并查找最新的下载文件
这种方法有一个流程,即使你打开一封两周前的电子邮件并点击下载链接,它也会给你最新的报告,而不是两周前的报告
那么,有人能告诉我一种方法来发送电子邮件中的下载链接,并与相应的文件建立关系吗?
电子邮件脚本
$down_link = Config_Reader::readProjectConfig('tad')->base_url.'CSVDownload.php;
$mail = new Zend_Mail ();
$sentFromEmail = $config->sentFromrec;
$tr = new Zend_Mail_Transport_Sendmail ( '-f' . $sentFromEmail );
Zend_Mail::setDefaultTransport ( $tr );
$mail->setReturnPath($sentFromEmail);
$mail->setFrom ( $sentFromEmail, 'Reporting' );
$email_body = "Hi,<br /><br />Download the weekly details of adtracker projects, by clicking the link below.
<br /> <a href=".$down_link.">Report</a><br /><br />Thank You.";
$mail->setBodyHtml ( $email_body );
$mail->addTo ( $weeklyReportRec);
$mail->setSubject ( "Report" );
try {
$mail->send ();
} catch ( Exception $e ) {
echo "Mail sending failed.\n";
}
您可以在下载链接上使用指示报告日期的查询参数/CSCDownload.php?日期=2015/02/17
这将允许您从可用列表中选择相应的报告。您可以使用类似的内容作为下载脚本。为了让它工作,我只做了几分钟的更改:
$date = $_GET['date'];
$basePath = "$download/dailyReport/";
$csvFiles = glob($basePath."/*.csv");
$file = $basePath . 'report_' . $date . '.csv';
$found = false;
foreach($csvFiles as $csvFile){
if($file === $csvFile){
$found = $csvFile;
// You have found the file, so you can stop searching
break;
}
}
if(false === $found){
exit("Server error!");
}
$h = fopen($found, "r");
$contents = fread($h, filesize($found));
现在,您可以在浏览器中使用“example.com/getcsvfile.php?date=2015_02_15”调用脚本,而不用担心注入问题,因为您可以检查该文件是否为csv文件之一 在包含报告日期的URL中添加一个参数,并在下载脚本中使用该参数,而不是仅返回最新的参数。我使用了它。。人们说它不安全!!!这可能会对我的服务器造成注入攻击检查参数的格式,确保它只是日期,没有其他。是的,我理解,你的意思是将日期和数学文件名放在同一日期…谢谢你的回复。。我正在研究它我用过它。。人们说它不安全!!!这可能会对我的服务器发起注入攻击—您没有存储在查询参数中发送的信息,也没有将其存储在任何地方。你只是在用它来解决报告。所以我不认为这会导致注射攻击。
$date = $_GET['date'];
$basePath = "$download/dailyReport/";
$csvFiles = glob($basePath."/*.csv");
$file = $basePath . 'report_' . $date . '.csv';
$found = false;
foreach($csvFiles as $csvFile){
if($file === $csvFile){
$found = $csvFile;
// You have found the file, so you can stop searching
break;
}
}
if(false === $found){
exit("Server error!");
}
$h = fopen($found, "r");
$contents = fread($h, filesize($found));