Скачивание файла через обработчик

Тема в разделе "Как сделать...", создана пользователем zek24, 1 авг 2013.

  1. zek24

    zek24

    Moderator
    Регистр.:
    14 ноя 2009
    Сообщения:
    776
    Симпатии:
    230
    Привет,
    появилась необходимость написать следующее, а голова что-то не думает, гугл не то советует...
    Итак, есть
    1) несколько групп пользователей group_id = 1, group_id = 2 ...
    2) есть для каждой группы прайс price1, price2...
    Задача -:
    1. выдать каждому юзеру (при заходе на сайт) уникальную (в пределах группы) ссылку на прайс.
    2. Не дать юзеру из одной группы скачать не свой прайс
    То есть для всез юзеров из группы 1 ссылка на прайс 1, для группы 2 прайс2 ...
    навоял следуюющее
    PHP:
    <?php if($customer_group_id == 2) { ?>
    <a href="<?php echo "/price/price2.xlsx"?>">price2</a>
    <?php ?>
    <?php 
    if($customer_group_id == 3) { ?>
    <a href="<?php echo "/price/price3.xlsx"?>">price3</a>
    <?php ?>
    Оно то работает как надо, но не соблюдается задача№2.
    Ни что не мешает вставить адрес прайса другой группы и скачать его. (предложил создавать уникальные названия прайсов типа sdf2323j30f.xls, но идею не поддержали).
    Пришел у выводу, что нужно писать форму и обработчик...
    HTML:
    <form action="/" method="post" enctype="text/plain">
      <input type="hidden" value='<?php echo $group_id' />
    <input type="submit" value="скачать прайс"/>
    </form>
    А вот с обработчиком ничего в голову не лезет.
    Не могу вспомнить функцию "отдачи файла"
    Выручайте)
     
  2. allseo

    allseo Создатель

    Регистр.:
    26 июн 2013
    Сообщения:
    38
    Симпатии:
    10
    PHP:
    header('Content-Disposition: attachment; filename=fileName.extension');

    Только ссылку на скачивание всё равно можно будет перехватить и отредактировать в любом вменяемом менеджере закачек. Чтобы под именем скрипта - читать на сервере и ech'ать, но тогда, во-первых, расширение пользователю руками менять придётся, во-вторых, для бинарных файлов это не подходит. Так что если уж защита так архимегаважна - рандомные имена. С .htaccess тут вряд ли что-то можно намудрить.
     
  3. zek24

    zek24

    Moderator
    Регистр.:
    14 ноя 2009
    Сообщения:
    776
    Симпатии:
    230
    Честно говоря не совсем понял, как можно вытащить ссылку с полным адресом, но задачу решил так (может кому пригодится:(
    PHP:
    function obrabotka_price($file)
    {
        if (
    file_exists($file)) {
            
    header('Content-Description: File Transfer');
            
    header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            
    header('Content-Disposition: attachment; filename=' basename($file));
            
    header('Content-Transfer-Encoding: binary');
            
    header('Expires: 0');
            
    header('Cache-Control: must-revalidate');
            
    header('Pragma: public');
            
    header('Content-Length: ' filesize($file));
            
    ob_clean();
            
    flush();
            
    readfile($file);
            exit;
        } else {
            echo 
    "Файл ".basename($file)." не существует";
        }
    }
     
  4. artxaker

    artxaker Создатель

    Регистр.:
    25 авг 2009
    Сообщения:
    39
    Симпатии:
    35
    а ты пробовал создавать одноименный price list путем php a проверка будет на стороне сервера если

    к примеру

    PHP:
    <?php
    if($data["user"]["group"] == 1){
     
        
    //создаем файл price list для первой группы
     
     
    }else{
     
    //или выводим ошибку
     
    }
    ?>
    так будет одноименно price и никто не будет искать price для другой группы поскольку он не будет создаваться
     
  5. zek24

    zek24

    Moderator
    Регистр.:
    14 ноя 2009
    Сообщения:
    776
    Симпатии:
    230
    прайсы создавать не требуется, они уже лежат по папочкам на серваке.
    требовалось их только отдавать в зависимости от группы, не показывая при этом пути их нахождения.
     
  6. artxaker

    artxaker Создатель

    Регистр.:
    25 авг 2009
    Сообщения:
    39
    Симпатии:
    35
    HTML:
    <a href="price.php">price</a>
    вот что я имел ввиду ;)
    PHP:
    <?php
    session_start
    ();
    $salt "4a654s6d";
    $groupId $SESSION["GID"];
    $md5Hash $SESSION["hash"];
    $pList = array(0,"price1.xlsx","price2.xlsx");
    function 
    download($filename) {
        if (
    file_exists($filename)) {
          
    header("Content-Disposition: attachment; filename='price.xlsx';"); //вот здесь независимо от имени и места файл обретает имя price.xlsx
            
    echo file_get_contents($filename);
        }
        else echo 
    "Not Found";
      }
    if(
    md5($groupId.$salt) == $md5Hash)
    {
        
    download($pList[$groupId]);
    }
    else
    {
                
    /*здесь даже можно сообщить в
                базу данных что пользователь пытался
                достать файл не принадлежащий ему*/
        
    for($i 0;$i <= count($pList);$i++){
            if(
    md5($i.$salt) == $md5Hash)
            {
                
    download($pList[$i]);
                
    $i count($pList);
            }else{
                
    $i++;
            }
        }
    }
    ?>