header('Content-Disposition: attachment; filename='.IRB_ROOT .'skins/files/25.jpg'); Подскажите пожалуйста, как сделать, чтобы пользователь получал файл с именем 25.jpg, а не O__home_sp.uz_www_skins_files_25.jpg
в караганде. =) Ты КАК собираешься отдавать файл? Телепатически? КУДА ты хочешь прописать хидер? Ответь на эти вопросы, и вопрос про "куда" отпадет автоматом.
Ну вобщем так я где-то прописываю ссылку, по нажатии идёт перенаправление в определённый скрипт. В этом скрипте - "если ссылка нажата, то..." и тут этот самый хэдэр. Файл скачивается, меня не устраивает только имя...
ну дык скрипт-то этот файл отдает. какое отношение отдаваемое имя имеет к имени файла который читается и отдается скриптом? (КО считает нужным указать, что никакого!) ты понимаешь?
Чувак, у меня инета на 15 минут осталось, будь другом, подскажи выход. Имя нужно отдавать отдельно? Ещё один хедер?
Нет. в этом хедере =) Иди спать! тут пишешь че как будет называтся для пользователя в хидерах, а читаешь и отдаешь тот файл, который сам хочешь. Ты понимаешь это, нет? Скрипту посрать как называется файл у тебя на сервере, как ты хочешь чтобы он назывался у юзера - пропиши в хедер. http://www.php.ru/forum/viewtopic.php?t=13296
вот че я намутил когда-то на его основе Код (PHP): <?php class download { var $properties = array( 'old_name' => '', 'new_name' => '', 'type' => '', 'size' => '', 'resume' => '', 'max_speed' => '' ); var $range = 0; function download($path, $name='', $type='application/force-download', $resume=0, $max_speed=0) { $name = ($name == '') ? substr(strrchr("/".$path,"/"),1) : $name; $file_size = @filesize($path); $this->properties = array( 'old_name' => $path, 'new_name' => $name, 'type'=> $type, 'size' => $file_size, 'resume' => $resume, 'max_speed' => $max_speed ); if ($this->properties['resume']) { if(isset($_SERVER['HTTP_RANGE'])) { $this->range = $_SERVER['HTTP_RANGE']; $this->range = str_replace('bytes=', '', $this->range); $this->range = str_replace('-', '', $this->range); } else { $this->range = 0; } if ($this->range > $this->properties['size']) $this->range = 0; } else { $this->range = 0; } } function download_file() { if ($this->range) { header($_SERVER['SERVER_PROTOCOL'].' 206 Partial Content'); } else { header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); } header('Pragma: public'); header('Expires: 0'); header('Cache-Control:'); header('Cache-Control: public'); header('Content-Description: File Transfer'); header('Content-Type: '.$this->properties["type"]); header('Content-Disposition: attachment; filename="'.$this->properties['new_name'].'";'); header('Content-Transfer-Encoding: binary'); if ($this->properties['resume']) header('Accept-Ranges: bytes'); if ($this->range) { header("Content-Range: bytes {$this->range}-".($this->properties['size']-1)."/".$this->properties['size']); header("Content-Length: ".($this->properties['size']-$this->range)); } else { header("Content-Length: ".$this->properties['size']); } @ini_set('max_execution_time', 0); @set_time_limit(); return $this->_download($this->properties['old_name'], $this->range); } function _download ($filename, $range=0) { @ob_end_clean(); if (($speed = $this->properties['max_speed']) > 0) $sleep_time = (8 / $speed) * 1e6; else $sleep_time = 0; $handle = fopen($filename, 'rb'); fseek($handle,$range); if ($handle === false) { return false; } //ob_flush(); while (!feof($handle)) { print (fread($handle, 1024*8)); flush(); usleep($sleep_time); } fclose($handle); return true; } } вызывается так: Код (PHP): <?php $a = new download('ПУТЬ К ФАЙЛУ КОТОРЫЙ ХОЧЕШЬ ОТДАТЬ', 'ИМЯ ПОД КОТОРЫМ ЕГО УВИДИТ ПОЛЬЗОВАТЕЛЬ', 'это тебе пока рано. Оставь как везде application/force-download', true); if ($a->download_file()) { if ($result = $db_filer->query("UPDATE `files` SET `downloads`=`downloads`+1, `date`=`date` WHERE ляляля пупупу ну ты понял это счетчик скачиваний'")) { //updated } }
Возник такой вопрос. Хотел бы ограничить количество одновременных скачиваний файла. Вроде всё просто: перед отдачей поле download_now обновляю на +1, после завершения на -1. Но если пользователь прекращает скачивание последнего update не происходит. и соответствено поле download_now не уменьшается. Как можно бороться с этим?
люди.. сориенттируйте чайника... по этому посту : http://www.php.ru/forum/viewtopic.php?p=101398#101398 создал страничку .. туда же положил нужный файл.. страничка называтся index.php .. директория /test/ .. соответственно .. когда в браузер втыкаем линк : http://www.site.co/test/ .. открывается окошко загрузки указанного файла.. как бы всё так и должно быть... не могу въехать ..как к этому коду прикрутить шифрованный путь ..к примеру имя папки test шифровать с помощью md5 .. чтобы линк на файл получился такой: http://www.site.co/d54f5fg4erg4/ как-то так..
без БД никак. Дешифровка md5 займет месяцы, результат может не соответствовать действительности надо в бд писать это дело. я тут на днях изобрел забавный алгоритм для именования файлов при загрузке на сервер. вот он. Даю как есть, соответственно потерев лишнее можете приспособить под свои нужды. Код (PHP): <?php class Files { private static $unifid_counter = -1, $unifid_rand = false; public static function unifid() { /* * функция использует 26 символов алфавита + 10 цифр чтобы создать уникальное имя файла в хранилище. * * За основу берется текущее время. Уникальность содержимого файлов не имеет значения. * Пример: li76ww-onjw-0h * $part1 = base_convert(time(), 10, 36); //Перевод текущего времени в 36-ти ричный формат: 6 символов. должно хватить на ближайшую четверть века. * $part3 = substr('00' . base_convert(self::$unifid_counter, 10, 36), -2); //счетчик файлов в текущем экземпляре скрипта * */ if (self::$unifid_rand === false) { self::$unifid_rand = substr('0000' . base_convert(rand(0, 1679615), 10, 36), -4); //один рандом на все вызовы функции в этом экземпляре скрипта. } ++self::$unifid_counter; return base_convert(time(), 10, 36) . '-' . self::$unifid_rand . '-' . substr('00' . base_convert(self::$unifid_counter, 10, 36), -2); } static public function AddNew($order, $work, $filename, $source, $mime) { /* * id int * unifid varchar(16) * date datetime * order int * name varchar(255) * mime varchar(255) */ $unifid = self::unifid(); $copyto = $_SERVER['DOCUMENT_ROOT'] . '/files/'.$unifid; if (move_uploaded_file($source, $copyto) === true) { //удачно скопирован файл, можно заносить запись в БД $query = " INSERT INTO `files` (`id`, `unifid`, `date`, `deleted`, `order`, `work`, `name`, `mime` ) VALUES ( NULL, '$unifid', NOW(), NULL, '$order', '$work', '".DB::escape($filename)."', '".DB::escape($mime)."');"; if ($id = DB::id($query)) { //удачно скопирован, и запись помещена в БД return $id; } } //запись о файле не был помещена в БД. Файл необходимо удалить. Извесить администратора. @unlink($copyto); Engine::logit("ERROR: не удалось поместить запись о новом файле в БД. Файл будет удален.(Заказ: $order, файл: $filename, загружен в: $source)."); return false; } } ?>
чувак, у тебя в БД хранится таблица с соответствием Придуманный GUID <=> Реальный путь Задача сводится к 0) Создать такую таблицу 1) Принять из запроса GUID 2) Найти соответствующий ему файл 3) Отдать файл Вперде
да чувак я тебя понял -))) вопрос в следующем.. положим есть таблица.. где айди.. айпи.. время сервера.. к примеру я шифрую по айпи адресу... правильная реализация пункта 1 и 3 с учетом того что человеку придет на почту письмо с ссылкой на файл.. ????