PHP生成下载链接

时间:2015-05-21 08:18:08

标签: javascript php jquery html ajax

我想说我想生成一个下载链接并将其放入<a>标记。

我的php脚本:

function download_link(){
    $this_id = "d"; //this is the name of file from server
    $original_filename = 'xample.pdf'; //This come from database
    $ext = pathinfo($original_filename, PATHINFO_EXTENSION);

    $file = '../uploads/'.$this_id.'.'.$ext;
    if (file_exists($file)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/'.$ext);
        header('Content-Disposition: attachment; filename='.$original_filename);//Rename the file with its original filename
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        return readfile($file);//Here where i want  to return the generated url
    }                       
    return '#'; //Or return nothing if file doesn't exist

   echo '<a href="'.function download_link().'"></a>'; //And put it here, the generated url

现在,我的目录位置是../uploads/
我希望得到如下结果:<a href="www.myserver.com/whatever the new url is"></a>所以当用户点击此标签时,将下载该文件。但相反,当我重新加载页面时,它会自动下载,而不会点击<a>标签的下载按钮。

note:我试图在点击下载时重命名文件名。 我知道我的逻辑存在问题。也许这可以用JQUERY完成?还是AJAX?我正在寻找解决方案,但没有找到答案。

这是我用JQUERY AJAX做的事情:
HTML标签
<a id="server_name_file_name">download</a>

JQUERY AJAX:

$('a').click(function(e) {
   e.preventDefault();
   var id = $(this).attr('id');
   $.ajax({
            type: 'POST',  
            url: 'download.php', 
            data: { server_file_name: id,},
            success: function(response) {
                if(response == 1){
                    alert("Unable to download, Maybe the file is corrupted. Please try to reload the page.");
                }else{
                    window.location.href = response;
                    return false;
                }
            }})

});

的download.php

$this_id = $_POST['server_file_name'];
$original_filename = 'xample.pdf'; //This come from database
$ext = pathinfo($original_filename, PATHINFO_EXTENSION);

    $file = '../uploads/'.$this_id.'.'.$ext;
    if (file_exists($file)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/'.$ext);
        header('Content-Disposition: attachment; filename='.$original_filename);//Rename the file with its original filename
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        echo readfile($file);//Here where i want  to return the generated url
        exit();
    }  die('1');

但不起作用。
有人可以帮我吗?
谢谢!!!!

2 个答案:

答案 0 :(得分:0)

您将返回actual contents of the file with readfile。 这就是为什么浏览器开始下载你返回的文件。

您需要做的是生成指向文件的字符串。 如果您的“上传”目录可以通过网址访问,那么您的downloads.php应如下所示:

$this_id = $_POST['server_file_name'];
$original_filename = 'xample.pdf'; //This come from database
$ext = pathinfo($original_filename, PATHINFO_EXTENSION);

$file = '../uploads/' . $this_id . '.' . $ext;
if (file_exists($file)) {
    echo 'www.myserver.com/uploads/' . $this_id . '.' . $ext;
    exit();
} 
die('1');

如果无法从外部访问您的上传目录,则需要先将该文件复制到公共目录中。

答案 1 :(得分:0)

乍一看,我可以发现一些问题。

您的下载功能不会返回文件的链接,而是会自动输出文件,因此在刷新页面时,文件正在下载是合乎逻辑的。

另外,我可以看到您使用function download_link()来调用您的函数,而应该直接download_link()

应该这样做的正确方法是将下载链接指向执行download_link函数的文件(例如:http://yoursite.com/download_file.php?file=filename

当然建议在URL中使用id而不是filename并应用您需要的所有安全性等...

在download_file.php文件中,您可以调用download_link($filename)或更好download_link($id)并从数据库或存储它的任何位置获取文件名,然后像现在一样输出文件。< / p>