我的网站服务器上有一个包含大量PDF文件的目录。
有什么办法可以在我网站的前端显示这个目录吗?所以所有文件都将以列表格式列出。然后我可以点击"一个文件,通过复选框或沿着这些行的东西,然后通过电子邮件发送文件?
我正在使用Joomla,所以这很可能是一个自定义模块。我已经知道如何使用查询列出文件,但查询会使服务器超载(503错误),因为实际上需要显示很多文件。
答案 0 :(得分:2)
您将要控制选择的文件数量。在您的页面上显示大量文件/复选框是个坏主意。特别是如果文件太多,您无法查询所有文件而不会出现错误。 (还有其他东西可能会发生503错误。)我们谈论了多少pdf?反正...
如果你只给我100个文件并且我选择全部100个会发生什么。你的代码将给我发送一封包含100个附件的电子邮件。(即使100个也会失败,电子邮件不适合这个。)那么如果我发生了什么非常喜欢你的pdf,而且我所做的就是整天坐在我的电脑上,每次按下按钮都会一次又一次地发送电子邮件,每次都有100个附件。现在图像100人都这样做。我确信你明白了,这会匆忙破坏你服务器的资源。
如果您可以从数据库中获取文件名,那可能是您最好的方法。我会对结果进行分页,所以说一次只显示20个文件。我只会让用户为每次提交选择最大数量的文件,因为电子邮件最有可能限制。我甚至会控制用户在给定时间内执行此功能的频率,以防止滥用。
我还会考虑直接从您的服务器下载文件到用户的计算机并完全绕过电子邮件,除非这不在您当前项目的目标范围内。
但是,当你构建它时,这些都是你想到的主题。但要获得概念验证。看看下面。
第1步 - 下载PHPMailer并开始运行,这样您就可以在页面上调用$mail = new PHPMailer;
并且不会出错。这是一个链接:
步骤2 - 搜索文件夹结构或数据库并返回包含文件路径的数组。
第3步 - 循环遍历数组并填充复选框。
步骤4 - 创建PHPMailer对象并添加对象属性 - 发送电子邮件。
require('path/to/PHPMailerClass'); //Or the path to the autoloader if that is how you installed.
$path = '/root/path/to/pdfFiles/';
$array = array_map('basename', glob($path . '*.pdf')); //This will return all pdf files in the directory.
echo
'<form action="" method="post">';
foreach($array as $file){
echo '<input name="fileName[]" type="checkbox" value="' . $file . '">' . $file . '<br>';
}
echo '<input name="send_email" type="submit" value="Send Email">';
echo
'</form>';
//You will need an array containing the user's information.
$userData = array(
'name' => 'John Doe',
'email' => 'John.Doe@example.com'
);
if(isset($_POST['send_email']) && $_POST['send_email']){ //Make sure they hit submit.
if(isset($_POST['fileName']) && $_POST['fileName']){ //Make sure they selected a file.
if(count($_POST['fileName']) > 5){
echo 'You can only select 5 files.';
exit();
}
//Set up the email.
$mail = new PHPMailer;
$mail->setFrom('from@example.com', 'Your Name');
$mail->addAddress($userData['email'], $userData['name']);
$mail->Subject = 'This is how to send attachments.';
$mail->isHTML(true);
$mail->Body = $userData['name'] . ',<br>' .
'Here are the files you selected!';
//Here is the attachment part.
foreach($_POST['fileName'] as $file){ //Loop across the selected files.
$mail->AddAttachment($path . $file, $file, 'base64', 'application/pdf'); //Attach the file.
}
if(!$mail->send()) { //Send the mail.
echo 'Message was not sent.';
echo 'Mailer error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent.';
}
}else{
echo 'No file was selected.';
}
}
如果您正在测试本地主机设置,则可能需要进行一些故障排除才能收到要发送的电子邮件。我没有经验,所以搜索谷歌和问题解决这个问题..如果经过一些很好的尝试使它工作,你无法弄清楚,发布另一个问题。