打开/保存位于服务器文件夹中的PDF


Open/save PDF located in server folder

我想让PHP内部网的用户能够打开/保存PDF文件,这些文件位于Apache服务器上的文件夹中。PDF有公司的私人信息,所以我不想把它们放在网络文件夹里。

echo '<form name="openpdf" method="POST" action="downloadPDF.php">';
echo '<input type="hidden" name="pdf">';
echo'</form>';
<tr>
<td> PDFFile1 </td>
<td><a href=javascript:void(null); onclick='document.openpdf.pdf.value="c:'pdfs'example.pdf";document.openpdf.submit(); return false;'><IMG src="img/pdf.jpg"></a></td></tr>

下载PDF.php:

<?
$pdf=$_POST["pdf"];
if (file_exists($pdf)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/pdf');   
    header('Content-Disposition: attachment; filename='.basename($pdf));   
    header('Content-Transfer-Encoding: binary');     
    header('Expires: 0');    
    header('Cache-Control: must-revalidate');   
    header('Pragma: public');   
    header('Content-Length: ' . filesize($pdf));     
    ob_clean();     
    flush();     
    readfile($pdf);     
    exit; 
} 
?>

问题是,当用户打开/保存文件时,路径指向该文件夹,但在客户端PC中,而不是在服务器上。

如果您在服务器上从PHP内部处理PDF,则应该从URL中省略file:///

所以应该是

$pdf="c:/pdfs/example.pdf";

服务器不知道客户端PC,因此readfile在此不工作。

您可能想尝试重定向,但我必须承认,我不知道浏览器是否出于安全原因允许重定向(您正在使用重定向切换协议)。

目前您正在做的是

  1. Javascript会在点击表单的pdf字段中输入值c:'pdfs'example.pdf,并将其提交到downloadpdf.php
  2. 在服务器上,Downloadpdf.php将$_POST["pdf"]值分配给$pdf
  3. 如果文件$pdf存在,它只是简单地向用户提供下载该文件的权限

现在,这个可以在服务器&客户端是同一台计算机(特别是在PC上,因为C:驱动器);即类似于本地XAMPP。但在现实世界中,用户和服务器将在完全不同的计算机上,if (file_exists($pdf))总是会失败(除非在服务器的C:上,文件夹pdfs中实际上有一个文件exaple.pdf)在现实世界中,步骤3将失败,因为$pdf=c:'pdfs'example.pdf和服务器将查看其自己的C:驱动器(如果是windows服务器)
你应该

1尝试使用HTML文件上载框上载文件
2使用$_FILES在服务器上获取/获取它并进行处理
3.发送下载所需的标头。

欲了解更多信息,请参阅HTML表单文件上传(谷歌)&_FILES(PHP.Net)