将文件从服务器下载到客户端的计算机

时间:2014-10-04 11:32:42

标签: php performance security download

我的根目录中有一个名为files的文件夹。 此文件夹包含的文件范围为1 Kb-1 GB

我想要一个可以使用AJAX异步下载文件的PHP脚本。

此代码在单击文件时启动下载脚本:

JQUERY

$('.download').click(function(){
   var src =$(this).attr('src');  
   $.post('download.php',{
      src :  src //contains name of file 
    },function(data){
      alert('Downloaded!');
    });
});

PHP

<?php
   $path = 'files/'.$_POST['src'];
   //here the download script must go!
?>

下载文件的最佳,最快和最安全方式是什么?

2 个答案:

答案 0 :(得分:4)

<?php
/**
 * download.php
 */

if (!empty($_GET['file'])) {
    // Security, down allow to pass ANY PATH in your server
    $fileName = basename($_GET['file']);
} else {
    return;
}

$filePath = '???/files/' . $fileName;
if (!file_exists($filePath)) {
    return;
}

header("Content-disposition: attachment; filename=" . $fileName);
header("Content-type: application/pdf");
readfile($filePath);

使用Content-disposition: attachment时,实际上AJAX请求是不必要的:

<a href="download.php?file=file1.pdf">File1</a>

答案 1 :(得分:0)

要继续原始答案,我添加了一些php函数,使其更具编程性:

$filePath = $_GET['path'];
$fileName = basename($filePath);
if (empty($filePath)) {
    echo "'path' cannot be empty";
    exit;
}

if (!file_exists($filePath)) {
    echo "'$filePath' does not exist";
    exit;
}

header("Content-disposition: attachment; filename=" . $fileName);
header("Content-type: " . mime_content_type($filePath));
readfile($filePath);

如果服务器需要强大的安全性,请不要在未使用同一脚本预先验证用户的情况下使用此功能。或使用原始答案发布的安全措施。该脚本将允许用户下载服务器上的任何文件。