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

zek24

Мой дом здесь!
Команда форума
Модератор
Регистрация
14 Ноя 2009
Сообщения
811
Реакции
310
  • Автор темы
  • Модер.
  • #1
Привет,
появилась необходимость написать следующее, а голова что-то не думает, гугл не то советует...
Итак, есть
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>
А вот с обработчиком ничего в голову не лезет.
Не могу вспомнить функцию "отдачи файла"
Выручайте)
 
PHP:
header('Content-Disposition: attachment; filename=fileName.extension');
Только ссылку на скачивание всё равно можно будет перехватить и отредактировать в любом вменяемом менеджере закачек. Чтобы под именем скрипта - читать на сервере и ech'ать, но тогда, во-первых, расширение пользователю руками менять придётся, во-вторых, для бинарных файлов это не подходит. Так что если уж защита так архимегаважна - рандомные имена. С .htaccess тут вряд ли что-то можно намудрить.
 
  • Автор темы
  • Модер.
  • #3
Честно говоря не совсем понял, как можно вытащить ссылку с полным адресом, но задачу решил так (может кому пригодится:(
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)." не существует";
    }
}
 
а ты пробовал создавать одноименный price list путем php a проверка будет на стороне сервера если

к примеру

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

так будет одноименно price и никто не будет искать price для другой группы поскольку он не будет создаваться
 
  • Автор темы
  • Модер.
  • #5
прайсы создавать не требуется, они уже лежат по папочкам на серваке.
требовалось их только отдавать в зависимости от группы, не показывая при этом пути их нахождения.
 
прайсы создавать не требуется, они уже лежат по папочкам на серваке.
требовалось их только отдавать в зависимости от группы, не показывая при этом пути их нахождения.

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++;
        }
    }
}
?>
 
Назад
Сверху