2015-05-21 3 views
1

Предположим, я хочу создать ссылку для загрузки и поместить ее в тег <a>.PHP Создание ссылки для загрузки

мой 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: Я пытаюсь переименовать имя файла при нажатии на загрузку botton. Я знаю, что в моей логике есть проблема. может быть, это можно сделать с помощью JQUERY? или AJAX? im искал решение, но не нашел ответа.

вот что я сделал с 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

У вас нет ссылки и скачиваний, сгенерированных в той же функции, есть функция для создания ссылки, а затем, когда ссылка нажата, вызовите другую которая генерирует загрузку и выводит диалоговое окно 'open with' или' save as'. – llanato

ответ

0

Вы возвращаете actual contents of the file with readfile. Вот почему браузер начинает загружать возвращаемый файл.

Что вам нужно сделать, это сгенерировать строку, которая укажет на файл. Если ваша «загрузка» реж доступен по URL, то ваш 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'); 

Если ваши добавления каталог не доступен снаружи, то вам необходимо скопировать файл в общий каталог первый.

0

На первый взгляд я могу определить пару проблем.

Ваша функция загрузки не возвращает ссылку на файл, а выводит сам файл, поэтому логично, что при обновлении страницы файл загружается.

Плюс, я вижу, что вы вызываете свою функцию, используя function download_link(), тогда как она должна быть непосредственно download_link().

Надлежащим образом это должно быть сделано, имея ссылку для загрузки файла выполнение функции download_link (например: http://yoursite.com/download_file.php?file=filename)

Конечно, желательно, чтобы иметь идентификатор вместо имени файла в URL и применить все безопасность вам нужно и т.д ...

Внутри download_file.php файл, вы можете вызвать download_link($filename) или лучше download_link($id) и получить имя файла из базы данных или там, где вы храните его, а затем выводят файл, как вы делаете сейчас.

Смежные вопросы