|
|
|
|
<?php
////////////////////////////////////////////////////////////
// 2005-2008 (C) Кузнецов М.В., Симдянов И.В.
// PHP. Практика создания Web-сайтов
// IT-студия SoftTime
// http://www.softtime.ru - портал по Web-программированию
// http://www.softtime.biz - коммерческие услуги
// http://www.softtime.mobi - мобильные проекты
// http://www.softtime.org - некоммерческие проекты
////////////////////////////////////////////////////////////
// Выставляем уровень обработки ошибок
// (http://www.softtime.ru/info/articlephp.php?id_article=23)
error_reporting(E_ALL & ~E_NOTICE);
////////////////////////////////////////////////////////////
// Загрузка файла на сервер file
////////////////////////////////////////////////////////////
class field_file extends field
{
// Директория назначения
protected $dir;
// Префикс
protected $prefix;
// Конструктор класса
function __construct($name,
$caption,
$is_required = false,
$value, // $_FILES
$dir,
$prefix = "",
$help = "",
$help_url = "")
{
// Вызываем конструктор базового класса field для
// инициализации его данных
parent::__construct($name,
"file",
$caption,
$is_required,
$value,
"",
$help,
$help_url);
$this->dir = $dir;
$this->prefix = $prefix;
if(!empty($this->value))
{
// Проверяем, не является ли файл скриптом PHP
// или Perl, html, если это так преобразуем его в формат .txt
$extentions = array("#\.php#is",
"#\.phtml#is",
"#\.php3#is",
"#\.html#is",
"#\.htm#is",
"#\.hta#is",
"#\.pl#is",
"#\.xml#is",
"#\.inc#is",
"#\.shtml#is",
"#\.xht#is",
"#\.xhtml#is");
// Заменяем русские символы на транслит
$this->value[$this->name]['name'] =
$this->encodestring($this->value[$this->name]['name']);
// Извлекаем из имени файла расширение
$path_parts = pathinfo($this->value[$this->name]['name']);
$ext = ".".$path_parts['extension'];
$path = basename($this->value[$this->name]['name'],$ext);
$add = $ext;
foreach($extentions AS $exten)
{
if(preg_match($exten, $ext)) $add = ".txt";
}
$path .= $add;
$path = str_replace("//","/",$dir."/".$prefix.$path);
// Перемещаем файл из временной директории сервера в
// директорию /files Web-приложения
if (copy($this->value[$this->name]['tmp_name'], $path))
{
// Уничтожаем файл во временной директории
@unlink($this->value[$this->name]['tmp_name']);
// Изменяем права доступа к файлу
@chmod($path, 0644);
}
}
}
// Метод, для возврата имени названия поля
// и самого тэга элемента управления
function get_html()
{
// Если элементы оформления не пусты - учитываем их
if(!empty($this->css_style))
{
$style = "style=\"".$this->css_style."\"";
}
else $style = "";
if(!empty($this->css_class))
{
$class = "class=\"".$this->css_class."\"";
}
else $class = "";
// Формируем тэг
$tag = "<input $style $class
type=\"".$this->type."\"
name=\"".$this->name."\">\n";
// Если поле обязательно, помечаем этот факт
if($this->is_required) $this->caption .= " *";
// Формируем подсказку, если она имеется
$help = "";
if(!empty($this->help))
{
$help .= "<span style='color:blue'>".
nl2br($this->help)
."</span>";
}
if(!empty($help)) $help .= "<br>";
if(!empty($this->help_url))
{
$help .= "<span style='color:blue'>
<a href=".$this->help_url.">помощь</a>
</span>";
}
return array($this->caption, $tag, $help);
}
// Метод, проверяющий корректность переданных данных
function check()
{
if($this->is_required)
{
if(empty($this->value[$this->name]))
{
return "Поле \"".$this->caption."\" не заполнено";
}
}
return "";
}
// Возвращает перекодированное имя файла
function get_filename()
{
if(!empty($this->value))
{
if(!empty($this->value[$this->name]['name']))
{
return mysql_escape_string($this->encodestring(
$this->prefix.$this->value[$this->name]['name']));
}
else return "";
}
else return "";
}
}
?>
|
каким образом использовать переменную префикс? $prefix нужно добавить к пути файла при загрузки на сервер файла get_filename() мотодом ! $prefix присвоить время с помощью функции и переименовать файл добавив его к названию! | |
|
|
|
|
|
|
|
для: сотка
(22.08.2012 в 19:16)
| | Отвечает Вассерман.
Загрузка файлов на сервер происходит при помощи функции copy();:
copy($_FILES["file"]["tmp_name"], "Куда_залить");
|
Далее можете самостоятельно добавить условия проверки разширения, типа файла.
Да в папку загрузки файлов рекомендуется вместо того, что приведено в этом классе кинуть файл .htaccess
У меня, например, он имеет вид:
RemoveHandler .php .phtm .htm .html .phtml .pl .rb .py .sh
AddType text/plain .php .phtm .htm .html .phtml .pl .rb .py .sh
<FilesMatch "\.ph(p3?|tml|pl|rb|py|sh)$">
SetHandler application/x-httpd-php-source
</FilesMatch>
<IfModule mod_mime.c>
AddType text/plain .php .php3 .php4 .php5 .php6 .phtml .pl .asp .aspx .cgi .exe .ico
</IfModule>
|
| |
|
|
|
|
|
|
|
для: Jaroslav
(22.08.2012 в 22:15)
| | Отвечает друг Вассермана - вы ошибаетесь, загрузка файла на сервер производится не этой функцией, а совсем иным механизмом. И перемещать из временной папки загруженный файл надо не функцией copy(), а move_uploaded_file().
Вопрос вообще-то совсем не об этом. | |
|
|
|
|
|
|
|
для: Jaroslav
(22.08.2012 в 22:15)
| | Отвечает Вассерман
Васерман далек от программирования, и судя по вашим ответам вы тоже.
Плохо когда вопрос остается без ответа, но еще хуже когда дают неправильные и неточные советы.
copy - это никакая не загрузка, а копирование, да и то уже давно есть move_upload_file() | |
|
|
|
|
|
|
|
для: Valick
(22.08.2012 в 22:30)
| | Загрузка файлов обычно происходит из формы. (тип file) После чего файл идёт во временную папку и далее да, копируется.. Все мы учимся. Особенно в программировании постоянно приходится узнавать что-то новое. Я, например, на своих соц. сетях с посещаемостью порядка 20.000 чел. в день для загрузки файлов использую функцию cope(); После чего переименовываю файл, если рисунок и надо обработать, уменьшаю размеры и кидаю на сервер.. Проблем никаких не возникает..
Про функцию move_upload_file() честно скажу, не знал.. позырю, спасибо. | |
|
|
|
|
|
|
|
для: Jaroslav
(22.08.2012 в 22:38)
| | эта функция считается более безопасной, так как проверяет загрузку файла по протоколу, в отличии от copy которой пофиг откуда взялся файл во временной директории. | |
|
|
|
|
|
|
|
для: Valick
(22.08.2012 в 22:43)
| | Не только это, есть еще несколько причин именно для ее использования, потому и похоронили copy() разработчики для таких операций. | |
|
|
|
|
|
|
|
для: Valick
(22.08.2012 в 22:43)
| | позырил.. По моему синтаксис один и тот же. Можно просто заменить "copy" на "move_uploaded_file"
Возможно, ещё преимущество в том, что если большой файл, то перемещение произойдёт чуть быстрее, чем копирование. (для видео, наверно, критично, для рисунок не особо). | |
|
|
|
|
|
|
|
для: Jaroslav
(22.08.2012 в 22:52)
| | Скорость тут не причем. Найдите в сети - почему все-таки не copy(). | |
|
|
|
|
|
|
|
для: confirm
(22.08.2012 в 22:54)
| | да вот нашёл: http://www.php.su/phphttp/?uploads почему copy(); :)
наверно, динозавры, ещё её используют.. Не суть важно. Я понял, что можно использовать другую.. | |
|
|
|
|
|
|
|
для: Jaroslav
(22.08.2012 в 22:55)
| | Неважнецкую инфу вы нашли.
Функция copy() не проверят откуда появился перемещаемый файл, или это действительно загруженный по HTTP POST, или подкидыш, и не делает проверки на существование файла.
Функция copy() не будет работать при включенной open_basedir.
При включенном safe_mode для использования copy() нужно устанавливать права на временную папку того же владельца, что и выполняет скрипт, то-есть загрузка будет невозможна для нескольких пользователей. | |
|
|
|
|
|
|
|
для: Jaroslav
(22.08.2012 в 22:15)
| | Спасибо конечно но вопрос не о том совсем ! Проще говоря есть файл files.mp3 а надо сделать из него 22082012_files.mp3! Записать путь в БД проблем не возникает ,а вот почему нет переименования в папке не понятно!
PS: лучше будет выслушать автора этого класса | |
|
|
|
|
|
|
|
для: сотка
(22.08.2012 в 22:48)
| |
copy($_FILES["file"]["tmp_name"], "$_FILES["file"]["name"]);
rename ($_FILES["file"]["name"], "22082012_files.mp3");
|
или при копировании сразу указывайте нужное имя файла.
или используйте move_uploaded_file(); как подсказали..
Можно, наверно, так:
move_uploaded_file($_FILES["file"]["tmp_name"], "22082012_files.mp3");
|
или как? по move_uploaded_file есть другие эксперты ))) | |
|
|
|
|
|
|
|
для: Jaroslav
(22.08.2012 в 22:59)
| | И что мы получаем ? 22082012_files.mp3 директория назначения?!?! | |
|
|
|
|
|
|
|
для: сотка
(04.09.2012 в 16:11)
| | имя файла. можно перед ним указать директорию. | |
|
|
|
|
|
|
|
для: сотка
(22.08.2012 в 19:16)
| | Всем добрый день!
Прошу сильно не пинать, учусь пока!
if (copy($this->value[$this->name]['tmp_name']))
|
при таком коде у меня ошибка и нечего не происходит, если меняю на
if (!empty($this->value[$this->name]['tmp_name']))
|
то ошибки нет, но и файл не добавляется, а в MySQL путь прописывается и в новости фото нет, но если ручками в директорию добавить этот файл, то и в просмотре новости появляется фото.
Помогите решить проблему. | |
|
|
|
|
|
|
|
для: ygm
(06.09.2012 в 07:03)
| |
if (copy($this->value[$this->name]['tmp_name'], $path))
|
| |
|
|
|
|
|
|
|
для: сотка
(10.09.2012 в 18:31)
| | И после сказанного вы все еще копируете? Тогда мы идем к вам. | |
|
|
|
|
|
|
|
для: confirm
(10.09.2012 в 19:16)
| | нет не копирую...использую move_uploaded_file | |
|
|
|
|
|
|
|
для: сотка
(10.09.2012 в 20:35)
| | Ясно, значит порошок вам не нужен :) | |
|
|
|
|
|
|
|
для: confirm
(10.09.2012 в 20:56)
| | (шопотом) а моя проблема так и не решена....( кривота рук моих -враг мой ) | |
|
|
|
|
|
|
|
для: сотка
(10.09.2012 в 22:06)
| | Зачем вам вообще класс этот? Неужто загрузка файла, это такая объемная задача по своей структуре, что обязательно требует ООП?
Напишите свой скрипт, отвечающий именно ваши потребностям, и возможно наполненный сервисом. И пусть это будет просто функция (набор функций), но главное, это будет действительно загрузка от "что сперва проверить" до "что последнее делаем". А уж ООП или просто "оп-ля", это уже дело десятое и по потребностям.
Вы заклинились на этом классе, а время его разработки еще времен Наполеона :), а время то меняется. | |
|
|
|
|
|
|
|
для: confirm
(10.09.2012 в 22:16)
| | Уже так и сделал ! Спасибо всем! | |
|
|
|
|
|
|
|
для: ygm
(06.09.2012 в 07:03)
| | Прошу прощения, но я так и не понял, что нужно сделать для загрузки файлов на сервер. | |
|
|
|