强制使用PHP下载文件

我在我的服务器上有一个CSV文件,如果用户点击一个链接,它应该下载,而是在我的浏览器窗口打开。

我的代码如下所示

 <a href="files/csv/example/example.csv"> Click here to download an example of the "CSV" file </a> 

这是一个networking服务器正常的networking服务器,我所有的开发工作。

我尝试了一些像

 <a href="files/csv/example/csv.php"> Click here to download an example of the "CSV" file </a> 

现在我的csv.php文件的内容:

 header('Content-Type: application/csv'); header('Content-Disposition: attachment; filename=example.csv'); header('Pragma: no-cache'); 

现在我的问题是它的下载,但不是我的CSV文件,它正在创build一个新的文件。

.htaccess解决scheme

要强制您的服务器上的所有csv的下载,添加您的.htaccess文件:

 AddType application/octet-stream csv 

PHP解决scheme

 header('Content-Type: application/csv'); header('Content-Disposition: attachment; filename=example.csv'); header('Pragma: no-cache'); readfile("/path/to/yourfile.csv"); 

或者你可以使用html5来做到这一点。 简单地用

 <a href="example.csv" download>download not open it</a> 

这不能可靠地完成,因为浏览器决定如何处理要求检索的URL。

您可以build议浏览器通过发送Content-disposition标头来提示 “保存到磁盘”:

 header("Content-disposition: attachment"); 

我不确定这是多么好的支持各种浏览器。 另一种方法是发送内容types的应用程序/八位字节stream,但这是一个黑客(你基本上是告诉浏览器“我不告诉你这是什么types的文件”,并根据大多数浏览器将提供一个下载对话框),据称会导致Internet Explorer的问题。

在Web Authoring常见问题解答中了解更多。

编辑你已经切换到一个PHP文件来提供数据 – 这是必要的设置内容处置标题(除非有一些神秘的Apache设置,也可以做到这一点)。 现在剩下要做的就是让PHP文件读取CSV文件的内容并打印它们 – 头filename=example.csv只向客户端浏览器build议使用该文件的名称,而不是实际上从服务器上的文件获取数据。

这是一个更安全的浏览器解决scheme:

  $fp = @fopen($yourfile, 'rb'); if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { header('Content-Type: "application/octet-stream"'); header('Content-Disposition: attachment; filename="yourname.file"'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header("Content-Transfer-Encoding: binary"); header('Pragma: public'); header("Content-Length: ".filesize($yourfile)); } else { header('Content-Type: "application/octet-stream"'); header('Content-Disposition: attachment; filename="yourname.file"'); header("Content-Transfer-Encoding: binary"); header('Expires: 0'); header('Pragma: no-cache'); header("Content-Length: ".filesize($yourfile)); } fpassthru($fp); fclose($fp); 

configuration您的服务器发送与媒体typesapplication/octet-stream

这意味着,您的浏览器可以处理这种文件types。

如果你不喜欢,最简单的方法是提供zip文件。 每个人都可以处理zip文件,并且可以默认下载。

干净的解决scheme。

 <?php header('Content-Type: application/download'); header('Content-Disposition: attachment; filename="example.csv"'); header("Content-Length: " . filesize("example.csv")); $fp = fopen("example.csv", "r"); fpassthru($fp); fclose($fp); ?> 

本页上的以前的答案介绍了如何使用.htaccess来强制所有types的文件下载。 但是,该解决scheme不适用于所有浏览器中的所有文件types。 这是一个更可靠的方法:

 <FilesMatch "\.(?i:csv)$"> ForceType application/octet-stream Header set Content-Disposition attachment </FilesMatch> 

您可能需要刷新浏览器caching才能正常工作。

如果你正在做你的appliaction本身..希望这个代码可以帮助..

HTML

在href – 你必须添加download_file.php以及你的url

 <a class="download" href="'/download_file.php?fileSource='+http://www.google.com/logo_small.png" target="_blank" title="YourTitle"> 

/ *这里是Download.php文件强制下载的东西* /

 <?php $fullPath = $_GET['fileSource']; if($fullPath) { $fsize = filesize($fullPath); $path_parts = pathinfo($fullPath); $ext = strtolower($path_parts["extension"]); switch ($ext) { case "pdf": header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download header("Content-type: application/pdf"); // add here more headers for diff. extensions break; default; header("Content-type: application/octet-stream"); header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); } if($fsize) {//checking if file size exist header("Content-length: $fsize"); } readfile($fullPath); exit; } ?>