С PHP как принудительно загрузить файл с именем и типом файла randon - PullRequest
0 голосов
/ 23 марта 2020

Я видел несколько ответов на вопросы здесь, чтобы заставить загрузку файла, но ни один, где имя и тип файла неизвестны или могут отличаться. Также загрузка должна быть принудительной только при нажатии на ссылку на файл (не на странице загрузки / refre sh, что происходит во время моих неудачных попыток).

У меня есть папка на веб-сервере который может содержать несколько разных типов файлов с именами файлов randon. Допустимые типы файлов: do c, docx, pdf, jpg, jpeg, png и gif (но больше будет добавлено позже).

Имя файла определяется пользователем, который загружает файл, используя другой файл php.

Только браузеры пользователей загружают только do c и docx.

Другие отображаются в браузере.

Я пробовал чтобы заставить пользователей щелкнуть правой кнопкой мыши по файлу, чтобы загрузить его, но это не слышно.

Код для отображения файлов достаточно прост.

<?php

    $dir = opendir('uploads/');

    echo '<ul>';
    while ($read = readdir($dir))
    {
        if ($read!='.' && $read!='..')
        {       

            echo '<li><a href="uploads/'.$read.'">'.$read.'</a></li>';

        }
    }

    echo '</ul>';

    closedir($dir);     

?>  

Я хотел бы, чтобы либо заставить диалоговое окно загрузки запускаться при нажатии на ссылку, либо на отдельную кнопку загрузки справа от ссылки.

Это легко сделать, используя php?

Ответы [ 2 ]

1 голос
/ 23 марта 2020

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

Я назову его загрузкой. php

загрузка. php

<?php
ignore_user_abort(true);  // prevents script termination
set_time_limit(0); // prevent time out

$file =  isset($_GET['file']) ? $_GET['file'] : ''; //get filename

if ($file) {
    $path_info = pathinfo($_GET['file']);
    $file_name = $path_info['basename'];
    $dir = "uploads";  //directory

    $path_to_file = $dir.'/'.$file_name; //full path

    if(!file_exists($path_to_file)) {  // check if file exist or terminate request

       exit('the file does not exist');
    }

    if(!is_readable($path_to_file)) { //check if file is readable from the directory

      exit("security issues. can't read file from folder");

     }

// set download headers for file

     $finfo = finfo_open(FILEINFO_MIME_TYPE);
     header('Content-Type: ' . finfo_file($finfo, $path_to_file));

     $finfo = finfo_open(FILEINFO_MIME_ENCODING);
     header('Content-Transfer-Encoding: ' . finfo_file($finfo, $path_to_file)); 

     header('Content-disposition: attachment; filename="' . basename($path_to_file) . '"'); 

    readfile($path_to_file); // force download file with readfile()
} 

else {

exit('download paramater missing');
}
?>

Использование

<a href="download.php?file=randomfilename.pdf">My pdf </a>

Надеюсь, это поможет.

0 голосов
/ 23 марта 2020
<a href="downloader.php?file=filename.extension">filename</a>

Затем в загрузчике . php файл

<?php

    ignore_user_abort(true);  // prevents script termination
    set_time_limit(0); // prevent time out

    $file =  isset($_GET['file']) ? $_GET['file'] : ''; //get filename

    if ($file) {
        $path_info = pathinfo($_GET['file']);
        $file_name = $path_info['basename'];
        $dir = "uploads";  //directory

        $path_to_file = $dir.'/'.$file_name; //full path

        if(!file_exists($path_to_file)) {  // check if file exist or terminate request

           exit('the file does not exist');
        }

        if(!is_readable($path_to_file)) { //check if file is readable from the directory

          exit("security issues. can't read file from folder");

         }

    // set download headers for file

         $finfo = finfo_open(FILEINFO_MIME_TYPE);
         header('Content-Type: ' . finfo_file($finfo, $path_to_file));

         $finfo = finfo_open(FILEINFO_MIME_ENCODING);
         header('Content-Transfer-Encoding: ' . finfo_file($finfo, $path_to_file)); 

         `header('Content-disposition: attachment; filename="' .` basename($path_to_file) . '"'); 

        readfile($path_to_file); // force download file with readfile()

    } else {

        exit('download paramater missing');
    }

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...