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

Форум PHP

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

 

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

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

тема: перезапись временного файла
 
 автор: Василий   (04.01.2012 в 04:16)   письмо автору
 
 

Друзья!
В 4 утра!
Пользователь корректирует свое название и загружает свой логотип.
<?php 
/**  
 * Function of uploaded of a file   
 * Функция загрузки файла (аплоадер)  
 * @param  int    $max_file_size    максимальный размер файла в килобайтах  
 * @param  array  $valid_extensions массив допустимых расширений  
 * @param  string $upload_dir       директория загрузки  
 * @return array                    сообщение о ходе выполнения  
 *  
 * @author IT studio IRBIS-team (www.irbis-team.com)  
 * @copyright © 2009 IRBIS-team   
 */  
    
function uploadHandle($max_file_size 100$valid_extensions = array(), $upload_dir '.')  
    {  
      
        
$error null;  
        
$info  null;  
        
$max_file_size *= 1024;  

        if (
$_FILES['userfile']['error'] === UPLOAD_ERR_OK)  
        {  
            
// проверяем расширение файла  
            
$file_extension pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);  
            if (
in_array($file_extension$valid_extensions))  
            {  
                
// проверяем размер файла  
                
if ($_FILES['userfile']['size'] < $max_file_size)  
                {  
                
$destination ="img/logo_pu/" $_FILES['userfile']['name']; 
      
                    if (
move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))  
                        
$info 'Файл успешно загружен';  
                    else  
                        
$error 'Не удалось загрузить файл';  
                }   
                else  
                    
$error 'Размер файла больше допустимого';  
            }   
            else  
                
$error 'У файла недопустимое расширение';  
        }   
        else  
        {  
            
// массив ошибок  
            
$error_values = array( 

                
UPLOAD_ERR_INI_SIZE   => 
                
'Размер файла больше разрешенного директивой upload_max_filesize в php.ini',  
                
UPLOAD_ERR_FORM_SIZE  => 
                
'Размер файла превышает указанное значение в MAX_FILE_SIZE',                            
                
UPLOAD_ERR_PARTIAL    => 'Файл был загружен только частично',   
                
UPLOAD_ERR_NO_FILE    => 'Не был выбран файл для загрузки',   
                
UPLOAD_ERR_NO_TMP_DIR => 'Не найдена папка для временных файлов',   
                
UPLOAD_ERR_CANT_WRITE => 'Ошибка записи файла на диск' 

                                  
);  
      
            
$error_code $_FILES['userfile']['error'];  
      
            if (!empty(
$error_values[$error_code]))  
                
$error $error_values[$error_code];  
            else  
                
$error 'Случилось что-то непонятное';  
        }  
      
        return array(
'info' => $info'error' => $error);  
    }  
      
/////////////////////////////////////////////////////////////////////      
    
$extensions = array('jpg''jpeg''png''gif');  
    
$upload_dir 'images';  
      
    
// Запускаем функцию  
    
if(!empty($_POST['upload_submit'])) 
    {      
        
$message uploadHandle(200$extensions$upload_dir);  
    
        
// Выводим сообщение  
        
echo $message['error'] ? $message['error'] : $message['info'];  
    } 
?>  

<form name="add" method='post' action='pu_add.php' enctype="multipart/form-data">
<table width="650" cellspacing="5" cellpadding="5">
 <tr>
  <td width="200" valign="top"><b>Название организации:</b></td>
  <td width="550" align="left" style='background-color:#f0f0f0'>
  <input value= "<?php echo $_GET['title']; ?>" type="text" name="title" size="80">
  </td>
 </tr>
 <tr>
   <td width="200" valign="top"><b>Logotip:</b></td>
    <td><input type="file" name="logo" value="<?php echo $_GET['logo']; ?>">загрузить</td>
</tr> 
 
 
</table>
<input name="id_pu" type="hidden" value="<?php echo $_GET['id_pu']; ?>">
   <br>
   <center>
     <label>
     <input type="submit" value="Сохранить изменения" name="upload_submit" id="submit">
    </label>
   </center>

</form>

</td>
</tr>
</table>


Array
(
    [logo] => Array
        (
            [name] => Яyutex.png
            [type] => image/png
            [tmp_name] => /tmp/phplPmhDQ
            [error] => 0
            [size] => 92734
        )
)

В данном случае в БД в поле logo записывается содержимое временной папки /tmp/phplPmhDQ
Содержимое папки logo на сервере пусто.
Покажите ошибку

  Ответить  
 
 автор: Василий   (04.01.2012 в 05:03)   письмо автору
 
   для: Василий   (04.01.2012 в 04:16)
 

стоит привести файл pu_add.php
if  (isset($_POST['logo']))          {$logo = $_POST['logo']; if ($logo == '') {unset ($logo);}}

if (isset($logo) {
$result = mysql_query ("insert pu SET logo='$logo',

Название организации меняется, а вот с логотипом проблемы

  Ответить  
 
 автор: Slo_Nik   (04.01.2012 в 13:10)   письмо автору
 
   для: Василий   (04.01.2012 в 05:03)
 

Повторю последний раз, включите мозги наконец то!!!
Название файла берите из массива $_FILES, а не из массива $_POST, потому что вот это

<input type="file" name="logo" value="<?php echo $_GET['logo']; ?>

бред сивой кобылы в лунную ночь...
разве у Вас название логотипа есть в массиве $_POST?
и где у Вас проверка содержимого массива в коде, где контроль ошибок?! Всё это должно быть прописано постоянно, в начале кода на момент отладки скрипта.
И ещё
стоит привести файл pu_add.php
надо сразу приводить тот код с которым работаете и в котором проблема, а не лепить что первое под руку попадётся, как в этом случае, так в во втором.
И последнее, если Вы загружаете логотип в этом файле, так и запись в базу производите тоже в этом файле.
Принцип такой.
1)Проверяете файл
2)Если нет ошибок - грузите
3)Если загрузка прошла успешно - записываете в базу имя файла
Всё в одном файле

[поправлено модератором]

  Ответить  
 
 автор: Василий   (04.01.2012 в 15:21)   письмо автору
 
   для: Slo_Nik   (04.01.2012 в 13:10)
 

   <td width="200" valign="top"><b>Logotip:</b></td>
    <td><input type="file" name="logo" value="<?php echo $_FILES['name']; ?>">загрузить</td>


Все равно записывается название временного файла. Ошибок нет

Array
(
    [logo] => Array
        (
            [name] => ЯБезымянный.png
            [type] => image/png
            [tmp_name] => /tmp/phprkWObP
            [error] => 0
            [size] => 69972
        )

)

  Ответить  
 
 автор: Василий   (04.01.2012 в 15:31)   письмо автору
 
   для: Василий   (04.01.2012 в 15:21)
 

И последнее, если Вы загружаете логотип в этом файле, так и запись в базу производите тоже в этом файле.
Как это сделать если включается обработчик:
<form name="add" method='post' action='pu_add.php' enctype="multipart/form-data">

  Ответить  
 
 автор: Василий   (04.01.2012 в 15:48)   письмо автору
 
   для: Василий   (04.01.2012 в 15:31)
 

видно не запускается
    // Запускаем функцию  
    if(!empty($_POST['upload_submit'])) 
    {      
        $message = uploadHandle(200, $extensions, $upload_dir);  
    
        // Выводим сообщение  
        echo $message['error'] ? $message['error'] : $message['info'];  

  Ответить  
 
 автор: Slo_Nik   (04.01.2012 в 16:16)   письмо автору
 
   для: Василий   (04.01.2012 в 15:31)
 

И Вам не выдаёт ни каких ошибок?

<input type="file" name="logo" value="<?php echo $_FILES['name']; ?>

>Как это сделать если включается обработчик:
Вы знаете зачем атрибут "action" для тега <form> ?Как это сделать если включается обработчик:
Вы знаете зачем атрибут

[поправлено модератором]

  Ответить  
 
 автор: Василий   (04.01.2012 в 16:18)   письмо автору
 
   для: Slo_Nik   (04.01.2012 в 16:16)
 

вы писали:
Название файла берите из массива $_FILES, а не из массива $_POST,
ну я и взял. Что нет так?

  Ответить  
 
 автор: Slo_Nik   (04.01.2012 в 16:25)   письмо автору
 
   для: Василий   (04.01.2012 в 16:18)
 

пропишите ка вначале скрипта error_reporting()
Как Вы можете получить из этого массива имя, если файл ещё не отправлен и массив пустой?

  Ответить  
 
 автор: cheops   (04.01.2012 в 16:32)   письмо автору
 
   для: Василий   (04.01.2012 в 16:18)
 

Дело в том, что $_FILES двумерный массив, первое измерение - имя загружаемого файла, второе - имя параметра. В вашем случае, если хотите получить имя файла, нужно использовать
<?php echo $_FILES['logo']['name']; ?>

  Ответить  
 
 автор: Slo_Nik   (04.01.2012 в 16:40)   письмо автору
 
   для: cheops   (04.01.2012 в 16:32)
 

тут дело даже не в том, что массив двухмерный, а в том, что пытается использовать атрибут value для input с типом file, да и ещё подставить значение, которого не существует до отправки формы.

  Ответить  
 
 автор: cheops   (04.01.2012 в 16:44)   письмо автору
 
   для: Slo_Nik   (04.01.2012 в 16:40)
 

Да согласен, это невозможно. Нужно просто при попытке изменить файл, удалять старый и загружать новый. Здесь ни браузер с сервером, ни PHP не предоставляют автоматический код, все эти операции придется программировать вручную.
1) Проверить загружается ли файл
2) Если загружается, удалить старый
3) Поместить на его место новый
4) Исправить запись в базе данных

  Ответить  
 
 автор: Slo_Nik   (04.01.2012 в 16:55)   письмо автору
 
   для: cheops   (04.01.2012 в 16:44)
 

Вы согласны, я согласен и ещё пару человек как минимум, которые тоже отвечали на вопросы Василия.
Проблема в том, что Василий не хочет думать и пытается делать всё сразу, вместо того, чтобы разбить решение на этапы.
1)Объединить формы и проверить корректность html
2) Загрузить файл, добиться того, чтобы файл загружался туда куда надо и под нужным именем
3) Объединить обработчики
4)В завершении всего записать новое имя в Базу Данных
5) Контролировать ошибки и содержимое массивов $_POST и $_FILES
Я не говорю, что я гений, знаю не намного большего чем Василий, но давно уяснил, что поэтапное решение лучше всего.
Теперь для Василия

<?php 
    
if(!empty($_POST['upload_submit']))  
    {       
        
$message uploadHandle(200$extensions$upload_dir);   
     
        
// Выводим сообщение   
        
echo $message['error'] ? $message['error'] : $message['info'];   
      
// Вот здесь я бы проверил, что возвращает функция, что содержит $message
     // и если содержит сообщение об успешной загрузке файл - создавать запрос и писать в базу
    


это как вариант решения задачи, а их может быть несколько

  Ответить  
 
 автор: cheops   (04.01.2012 в 17:18)   письмо автору
 
   для: Slo_Nik   (04.01.2012 в 16:55)
 

>но давно уяснил, что поэтапное решение лучше всего.
Тоже так считаю, но уж больно много всего в Web, тут 10 лет не хватит, чтобы охватить все технологии, с чего-то нужно начинать.
>Проблема в том, что Василий не хочет думать и пытается делать всё сразу, вместо того, чтобы
>разбить решение на этапы.
Нормально он думает, просто информации у него пока мало (а у нас она на подкорку вывалилась и нам приходится напрягаться, чтобы вспоминать и прописывать вещи, которые уже давно кажутся само собой разумеющимися - ничего, это полезно :). Василий же, посмотрит, приобретет опыт и сам решит, как ему штурмовать эту гору (последовательно или мощной атакой по всем направлениям). Может он вообще развернется и пойдет штурмовать что-то другое :)))

  Ответить  
 
 автор: Василий   (04.01.2012 в 16:44)   письмо автору
 
   для: Slo_Nik   (04.01.2012 в 16:40)
 

так как надо то?

  Ответить  
 
 автор: cheops   (04.01.2012 в 16:46)   письмо автору
 
   для: Василий   (04.01.2012 в 16:44)
 

Просто смотреть, будет ли пользователь загружать файл, если поля массива $_FILES['logo'] заполнены, значит, пользователь пытается заменить файл, действуйте по алгоритму, описанному постом выше. Если поля пусты, значит он хочет, чтобы файл остался старым и ничего с ним делать не нужно.

  Ответить  
 
 автор: Василий   (04.01.2012 в 17:01)   письмо автору
 
   для: cheops   (04.01.2012 в 16:46)
 

$error = 'Случилось что-то непонятное'; "

выводится - Случилось что-то непонятное

  Ответить  
 
 автор: Василий   (04.01.2012 в 17:03)   письмо автору
 
   для: Василий   (04.01.2012 в 17:01)
 

поля массива $_FILES['logo'] заполнены

так запись
    <td><input type="file" name="logo" value="<?php echo $_FILES['logo']['name']; ?>">загрузить</td>

не верна?

  Ответить  
 
 автор: cheops   (04.01.2012 в 17:14)   письмо автору
 
   для: Василий   (04.01.2012 в 17:03)
 

Нет, не верна. Тут есть две хитрости. Малая заключается в том, что input-тэги типа file не имеют атрибута value, его можно писать, можно не писать - этот атрибут просто игнорируется. Не будем сейчас вдаваться почему, сделано это из соображений безопасности и очень давно. Т.е. подставить в поле значение у вас не получится. При редактировании оно останется пустым, только сам пользователь может его заполнить, если захочет (например, чтобы загрузить новый файл).
Вторая хитрость более глобальная и заключается в том, что вы работаете над технологией Web-программирования. Тут просто одним знанием PHP не обойтись. Нужно знать другие языки и технологии, вот эта заковыка с file, это область языка разметки HTML, который вообще говоря тоже нужно знать и возможно вперед PHP, так как незнание его вам мешает разрабатывать PHP-приложения.
Это не упрек, это просто состояние дел, как вы понимаете, не мы придумали, чтобы Web-приложения создавались с использованием десятков языков и сами не в восторге от этого :))), но чтобы писать приложения вам придется много изучить и одним PHP, к сожалению, не обойтись. Пока просто знайте, что в file нельзя подставить значение, как в text или textarea.

  Ответить  
 
 автор: Василий   (04.01.2012 в 17:26)   письмо автору
 
   для: cheops   (04.01.2012 в 17:14)
 

получилось!
Спасибо. Файл записывается.
Есть вопрос. Открываю другую тему

  Ответить  
 
 автор: Slo_Nik   (04.01.2012 в 17:31)   письмо автору
 
   для: Василий   (04.01.2012 в 17:26)
 

УРА!!! СВЕРШИЛОСЬ ЧУДО!!! )))
Удачи в дальнейшей разработке

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

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