Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Класс загрузки файлов от софттайм
 
 автор: сотка   (22.08.2012 в 19:16)   письмо автору
 
 

<?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($path0644);
        }
      }
    }

    
// Метод, для возврата имени названия поля
    // и самого тэга элемента управления
    
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 присвоить время с помощью функции и переименовать файл добавив его к названию!

  Ответить  
 
 автор: Jaroslav   (22.08.2012 в 22:15)   письмо автору
 
   для: сотка   (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>

  Ответить  
 
 автор: confirm   (22.08.2012 в 22:27)   письмо автору
 
   для: Jaroslav   (22.08.2012 в 22:15)
 

Отвечает друг Вассермана - вы ошибаетесь, загрузка файла на сервер производится не этой функцией, а совсем иным механизмом. И перемещать из временной папки загруженный файл надо не функцией copy(), а move_uploaded_file().

Вопрос вообще-то совсем не об этом.

  Ответить  
 
 автор: Valick   (22.08.2012 в 22:30)   письмо автору
 
   для: Jaroslav   (22.08.2012 в 22:15)
 

Отвечает Вассерман
Васерман далек от программирования, и судя по вашим ответам вы тоже.
Плохо когда вопрос остается без ответа, но еще хуже когда дают неправильные и неточные советы.
copy - это никакая не загрузка, а копирование, да и то уже давно есть move_upload_file()

  Ответить  
 
 автор: Jaroslav   (22.08.2012 в 22:38)   письмо автору
 
   для: Valick   (22.08.2012 в 22:30)
 

Загрузка файлов обычно происходит из формы. (тип file) После чего файл идёт во временную папку и далее да, копируется.. Все мы учимся. Особенно в программировании постоянно приходится узнавать что-то новое. Я, например, на своих соц. сетях с посещаемостью порядка 20.000 чел. в день для загрузки файлов использую функцию cope(); После чего переименовываю файл, если рисунок и надо обработать, уменьшаю размеры и кидаю на сервер.. Проблем никаких не возникает..
Про функцию move_upload_file() честно скажу, не знал.. позырю, спасибо.

  Ответить  
 
 автор: Valick   (22.08.2012 в 22:43)   письмо автору
 
   для: Jaroslav   (22.08.2012 в 22:38)
 

эта функция считается более безопасной, так как проверяет загрузку файла по протоколу, в отличии от copy которой пофиг откуда взялся файл во временной директории.

  Ответить  
 
 автор: confirm   (22.08.2012 в 22:44)   письмо автору
 
   для: Valick   (22.08.2012 в 22:43)
 

Не только это, есть еще несколько причин именно для ее использования, потому и похоронили copy() разработчики для таких операций.

  Ответить  
 
 автор: Jaroslav   (22.08.2012 в 22:52)   письмо автору
 
   для: Valick   (22.08.2012 в 22:43)
 

позырил.. По моему синтаксис один и тот же. Можно просто заменить "copy" на "move_uploaded_file"
Возможно, ещё преимущество в том, что если большой файл, то перемещение произойдёт чуть быстрее, чем копирование. (для видео, наверно, критично, для рисунок не особо).

  Ответить  
 
 автор: confirm   (22.08.2012 в 22:54)   письмо автору
 
   для: Jaroslav   (22.08.2012 в 22:52)
 

Скорость тут не причем. Найдите в сети - почему все-таки не copy().

  Ответить  
 
 автор: Jaroslav   (22.08.2012 в 22:55)   письмо автору
 
   для: confirm   (22.08.2012 в 22:54)
 

да вот нашёл: http://www.php.su/phphttp/?uploads почему copy(); :)
наверно, динозавры, ещё её используют.. Не суть важно. Я понял, что можно использовать другую..

  Ответить  
 
 автор: confirm   (23.08.2012 в 08:49)   письмо автору
 
   для: Jaroslav   (22.08.2012 в 22:55)
 

Неважнецкую инфу вы нашли.
Функция copy() не проверят откуда появился перемещаемый файл, или это действительно загруженный по HTTP POST, или подкидыш, и не делает проверки на существование файла.
Функция copy() не будет работать при включенной open_basedir.
При включенном safe_mode для использования copy() нужно устанавливать права на временную папку того же владельца, что и выполняет скрипт, то-есть загрузка будет невозможна для нескольких пользователей.

  Ответить  
 
 автор: сотка   (22.08.2012 в 22:48)   письмо автору
 
   для: Jaroslav   (22.08.2012 в 22:15)
 

Спасибо конечно но вопрос не о том совсем ! Проще говоря есть файл files.mp3 а надо сделать из него 22082012_files.mp3! Записать путь в БД проблем не возникает ,а вот почему нет переименования в папке не понятно!

PS: лучше будет выслушать автора этого класса

  Ответить  
 
 автор: Jaroslav   (22.08.2012 в 22:59)   письмо автору
 
   для: сотка   (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 есть другие эксперты )))

  Ответить  
 
 автор: сотка   (04.09.2012 в 16:11)   письмо автору
 
   для: Jaroslav   (22.08.2012 в 22:59)
 

И что мы получаем ? 22082012_files.mp3 директория назначения?!?!

  Ответить  
 
 автор: Jaroslav   (04.09.2012 в 21:46)   письмо автору
 
   для: сотка   (04.09.2012 в 16:11)
 

имя файла. можно перед ним указать директорию.

  Ответить  
 
 автор: ygm   (06.09.2012 в 07:03)   письмо автору
 
   для: сотка   (22.08.2012 в 19:16)
 

Всем добрый день!
Прошу сильно не пинать, учусь пока!
if (copy($this->value[$this->name]['tmp_name']))

при таком коде у меня ошибка и нечего не происходит, если меняю на
 if (!empty($this->value[$this->name]['tmp_name']))

то ошибки нет, но и файл не добавляется, а в MySQL путь прописывается и в новости фото нет, но если ручками в директорию добавить этот файл, то и в просмотре новости появляется фото.
Помогите решить проблему.

  Ответить  
 
 автор: сотка   (10.09.2012 в 18:31)   письмо автору
 
   для: ygm   (06.09.2012 в 07:03)
 

if (copy($this->value[$this->name]['tmp_name'], $path))

  Ответить  
 
 автор: confirm   (10.09.2012 в 19:16)   письмо автору
 
   для: сотка   (10.09.2012 в 18:31)
 

И после сказанного вы все еще копируете? Тогда мы идем к вам.

  Ответить  
 
 автор: сотка   (10.09.2012 в 20:35)   письмо автору
 
   для: confirm   (10.09.2012 в 19:16)
 

нет не копирую...использую move_uploaded_file

  Ответить  
 
 автор: confirm   (10.09.2012 в 20:56)   письмо автору
 
   для: сотка   (10.09.2012 в 20:35)
 

Ясно, значит порошок вам не нужен :)

  Ответить  
 
 автор: сотка   (10.09.2012 в 22:06)   письмо автору
 
   для: confirm   (10.09.2012 в 20:56)
 

(шопотом) а моя проблема так и не решена....( кривота рук моих -враг мой )

  Ответить  
 
 автор: confirm   (10.09.2012 в 22:16)   письмо автору
 
   для: сотка   (10.09.2012 в 22:06)
 

Зачем вам вообще класс этот? Неужто загрузка файла, это такая объемная задача по своей структуре, что обязательно требует ООП?
Напишите свой скрипт, отвечающий именно ваши потребностям, и возможно наполненный сервисом. И пусть это будет просто функция (набор функций), но главное, это будет действительно загрузка от "что сперва проверить" до "что последнее делаем". А уж ООП или просто "оп-ля", это уже дело десятое и по потребностям.
Вы заклинились на этом классе, а время его разработки еще времен Наполеона :), а время то меняется.

  Ответить  
 
 автор: сотка   (12.09.2012 в 22:04)   письмо автору
 
   для: confirm   (10.09.2012 в 22:16)
 

Уже так и сделал ! Спасибо всем!

  Ответить  
 
 автор: ygm   (11.09.2012 в 04:39)   письмо автору
 
   для: ygm   (06.09.2012 в 07:03)
 

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования