Перейти к содержимому


Доп. действие во всплывающем окне с загрузкой файлов


Сообщений в теме: 27

#1 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 29 Июль 2014 - 12:15

Добрый день.
Имеется задача, чтобы пользователь мог загружать файлы в таблицу нажимая кнопку доп. действия.
Пытаюсь записать в таблицу, но файл не создается - пишет file not exist. Подскажите пожалуйста в чем ошибка.

Код:
if (isset($_REQUEST["comment"]) || $_FILES["files"]['error'] == 0)
         
{
                         $line
['статус'] = "Отвечено";
                         $line
['Файл'] = $_FILES["files"]["name"]; //serialize($uploaded);
                         $line
['Ответ'] = $_REQUEST["comment"];
                         $mas
['Вопрос / Ответ']=$_REQUEST["comment"];
                         $mas
['Дата'] = date("Y-m-d H:i:s");
                         $mas
['Задание']=$line['Задание']['Номер'];
                         $mas
['Исполнитель'] = $line['Исполнитель'];
                         $mas
['Соисполнитель']= $line['Соисполнитель'];
                         $mas
['Файл'] = $_FILES["files"]["name"];
                                         
// производим нужные нам действия с необходимыми полями
                         insert_query
($mas, "Обращения");  
       
                         $mas2
['Назначил']=$user['id'];
                         $mas2
['Исполнитель']=$line['Исполнитель'];
                         $mas2
['Задание']=$line['Задание']['Номер'];
 
                         $mas2
['Статус выполнения']="Обращение/ответ";
 
                         $mas2
['Дата']= date("Y-m-d H:i:s");
 
                         $mas2
['Ссылка'] = $line['ID'];
                         insert_query
($mas2, "Работа по заданию");
 
                         echo
"<script>";
                         echo
"window.opener.location.reload(1);"; // Перезагружаем родительское окно
                         echo
"window.close()"; // Закрываем текущее
                         echo
"</script>";
               
}
echo
"<form method='post' enctype='multipart/form-data'>";
echo
"Ваш ответ:";
echo
"<input type='hidden' name='id' value='$button_id'>"; // Передаем значение кнопки
echo
"<input type='hidden' name='line_id' value='$ID'>";  // Значение строки
echo
"<input type='hidden' name='csrf' value='{$csrf}'>";
echo
"<br><textarea name='comment' rows='10' cols='30'> </textarea><br>";
echo
"Загрузить файл:";
echo
"<input name='files' size='18' type='file' multiple='multiple' value=''>";
echo
"<br><input type='submit' value='Отправить'>";
echo
"</form>";

UPD: Поправьте пожалуйста название темы - речь идет конечно о доп. действии

Сообщение отредактировал aleks.goodcolor: 29 Июль 2014 - 12:47


#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 29 Июль 2014 - 13:28

Вы записываете в БД только имя файла, а сам файл никуда не загружен. Естественно, что выйдет "файл не найден".

Ищите на форуме темы про загрузку файлов.

#3 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 29 Июль 2014 - 13:32

Вот другой вариант - фото загружается в папку но в названии файла появляются лишние символы и файл не находит:

function GetFile($dir, $value, $type)
{
   $mass
= array();
   
if(is_array($_FILES[$value]['tmp_name']))
   
{
    $count
= count($_FILES[$value]['tmp_name']);
   
for($i = 0; $i < $count; $i++)
   
{
         
if( $_FILES[$value]['error'][$i] == 0 )
                         
{ //echo '2<br>';
                           
//Если файл загружен успешно, то проверяем его тип
                                 
if($type == '' || substr($_FILES[$value]['type'][$i], 0, 5) == $type )
                         
{
                           $tmpname
= $_FILES[$value]['tmp_name'][$i]; //echo $tmpname.'<br>';
                   
//$name = preg_replace('/.*?[\\\/]+([a-z0-9._]+?)/i', '$1', $tmpname);
                    $name
= $_FILES[$value]['name'][$i];
                          $ext
= preg_replace('/^.+?[.]([a-z0-9]+?)$/i', '$1', $name);
if($ext != 'exe' && $ext != 'php')
{
                    $name
= md5($name.date('Y.m.d H:i:s')).'.'.$ext;
                   
@copy($tmpname, $dir.'/'.$name);
                         $mass
[] = $name;
}
                   
}
                 
}
   
}
   
return $mass;
   
}
   
else
   
{
   
if( $_FILES[$value]['error'] == 0 )
         
{ //echo '2<br>';
           
//Если файл загружен успешно, то проверяем его тип
           
if($type == '' || substr($_FILES[$value]['type'], 0, 5) == $type )
         
{
          $tmpname
= $_FILES[$value]['tmp_name']; //echo $tmpname.'<br>';
   
//$name = preg_replace('/.*?[\\\/]+([a-z0-9._]+?)/i', '$1', $tmpname);
   $name
= $_FILES[$value]['name'];
          $ext
= preg_replace('/^.+?[.]([a-z0-9]+?)$/i', '$1', $name);
   
if($ext != 'exe' && $ext != 'php')
{
   $name
= md5($name.date('Y.m.d H:i:s')).'.'.$ext;
   
@copy($tmpname, $dir.'/'.$name);
   $mass
[] = $name;
}
   
return $mass;
         
}
   
}
   
}
   
return NULL;
}
if (isset($_REQUEST["comment"]) || $_FILES["files"]['error'] == 0)
   
{
         $dir
="files";
         $uploaded
= GetFile($dir,'files', '');
         $line
['статус'] = "Отвечено";
         $line
['Файл'] = serialize($uploaded);
         $line
['Ответ'] = $_REQUEST["comment"];
         $mas
['Вопрос / Ответ']=$_REQUEST["comment"];
         $mas
['Дата'] = date("Y-m-d H:i:s");
         $mas
['Задание']=$line['Задание']['Номер'];
         $mas
['Исполнитель'] = $line['Исполнитель'];
         $mas
['Соисполнитель']= $line['Соисполнитель'];
         $mas
['Файл'] = $_REQUEST["files"];
         
// производим нужные нам действия с необходимыми полями
         insert_query
($mas, "Обращения");  
       
         $mas2
['Назначил']=$user['id'];
         $mas2
['Исполнитель']=$line['Исполнитель'];
         $mas2
['Задание']=$line['Задание']['Номер'];
 
         $mas2
['Статус выполнения']="Обращение/ответ";
         $mas2
['Статус контроля']="новый";
         $mas2
['Дата']= date("Y-m-d H:i:s");
         
/*$res = data_select(572,"`status`=0 AND `f9552`=",$line['Задание']);
         $row = sql_fetch_assoc($res);*/

         $mas2
['Ссылка'] = $line['ID'];
         insert_query
($mas2, "Работа по заданию");
   
         echo
"<script>";
         echo
"window.opener.location.reload(1);"; // Перезагружаем родительское окно
         
//echo "window.close()"; // Закрываем текущее
         echo
"</script>";
   
}
echo
"<form method='post' enctype='multipart/form-data'>";
echo
"Ваш ответ:";
echo
"<input type='hidden' name='id' value='$button_id'>"; // Передаем значение кнопки
echo
"<input type='hidden' name='line_id' value='$ID'>";  // Значение строки
echo
"<input type='hidden' name='csrf' value='{$csrf}'>";
echo
"<br><textarea name='comment' rows='10' cols='30'> </textarea><br>";
echo
"Загрузить файл:";
echo
"<input name='files' size='18' type='file' multiple='multiple' value=''>";
echo
"<br><input type='submit' value='Отправить'>";
echo
"</form>";


#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 29 Июль 2014 - 13:45

А зачем вы заменяете имя файла? И к чему вообще данная функция? Откуда вы ее взяли? Этот вариант еще хуже, т.к. его логика полностью непонятна и взята откуда-то с потолка.

Первый вариант собственно как раз верный за исключением того что там нет записи самого файла в папку files по правилам КБ. Второй - сразу на помойку, он не имеет никакого отношения к нашей программе.

#5 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 29 Июль 2014 - 15:10

Посмотрел примеры - вот что получилось:

if (isset($_REQUEST["comment"]) || $_FILES["files"]['name'] != 0)
   
{
         $fname
= trim($_FILES["files"]["name"]);
         
//$dir = "files2";
         $li
= get_file_path(9632, $line['ID']);
         $path
= $_SERVER['DOCUMENT_ROOT'].'/files2/'.$fname;
         copy
($li, $fname, $path);
         $dat
= file_get_contents($li, true); // загружаем файл в переменную
         save_data_file
(9632,$line['ID'],$fname,$dat);
         $line
['статус'] = "Отвечено";
         $line
['Файл'] = $fname;
         $line
['Ответ'] = $_REQUEST["comment"];
         $mas
['Вопрос / Ответ']=$_REQUEST["comment"];
         $mas
['Дата'] = date("Y-m-d H:i:s");
         $mas
['Задание']=$line['Задание']['Номер'];
         $mas
['Исполнитель'] = $line['Исполнитель'];
         $mas
['Соисполнитель']= $line['Соисполнитель'];
         $mas
['Файл'] = $fname;
         
// производим нужные нам действия с необходимыми полями
         insert_query
($mas, "Обращения");  
       
         $mas2
['Назначил']=$user['id'];
         $mas2
['Исполнитель']=$line['Исполнитель'];
         $mas2
['Задание']=$line['Задание']['Номер'];
 
         $mas2
['Статус выполнения']="Обращение/ответ";
         $mas2
['Статус контроля']="новый";
         $mas2
['Дата']= date("Y-m-d H:i:s");
       
         $mas2
['Ссылка'] = $line['ID'];
         insert_query
($mas2, "Работа по заданию");
 
         echo
"<script>";
         echo
"window.opener.location.reload(1);"; // Перезагружаем родительское окно
         echo
"window.close()"; // Закрываем текущее
         echo
"</script>";
   
}
echo
"<form method='post' enctype='multipart/form-data'>";
echo
"Ваш ответ:";
echo
"<input type='hidden' name='id' value='$button_id'>"; // Передаем значение кнопки
echo
"<input type='hidden' name='line_id' value='$ID'>";  // Значение строки
echo
"<input type='hidden' name='csrf' value='{$csrf}'>";
echo
"<br><textarea name='comment' rows='10' cols='30'> </textarea><br>";
echo
"Загрузить файл:";
echo
"<input name='files' size='18' type='file' multiple='multiple' value=''>";
echo
"<br><input type='submit' value='Отправить'>";
echo
"</form>";

Теперь если одно изображение, то работает, но если пытаюсь загрузить несколько, то загружается только последнее

Сообщение отредактировал aleks.goodcolor: 29 Июль 2014 - 15:28


#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 29 Июль 2014 - 15:57

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

#7 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 29 Июль 2014 - 16:08

Кстати, у вас похоже лишние строки в коде, попробуйте так:

$fname = trim($_FILES["files"]["name"]);
$dat
= file_get_contents($_FILES["files"]["tmp_name"]); // загружаем файл в переменную
save_data_file
(9632,$line['ID'],$fname,$dat);

Т.е., насколько я понимаю, для сохранения файла достаточно использовать функцию save_data_file. Ничего копировать отдельно не нужно.

(это вариант для одного файла)

#8 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 29 Июль 2014 - 16:41

Это все так - я уже закомментировал где я использую copy, потому что он у меня отказывается работать. попытался сделать цикл, но никак не хочет записывать в таблицу хотя проверил переменные - передаются правильно.
for ($i=0; $i<=count($_FILES['files']['name']); $i++)
           
{
                  $fname
= $_FILES["files"]["name"][$i];
                  $li
= get_file_path(9632, $line['ID'], $fname);
                  $dat
= file_get_contents($li, true);
                 
// move_uploaded_file($li,"$uploadDir/$fname");
                  save_data_file
(9632, $line['ID'], $fname, $dat);
                  $line
['Файл'] = $fname;
                  $mas
['Файл'] = $fname;
           
}

Сообщение отредактировал aleks.goodcolor: 29 Июль 2014 - 16:42


#9 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 29 Июль 2014 - 16:56

А вы уверены, что правильно проходите массив? Структуру массива смотрели через print_r?

Это во-первых, а во-вторых, зачем вы опять берете путь для чтения содержимого из get_file_path(9632, $line['ID'], $fname)? Там же пусто, т.к. файла там еще нет. Я же дал вам правильный вариант выше.

#10 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 30 Июль 2014 - 09:04

Поправил код под структуру массива но все равно не хочет записывать:

if(is_array($_FILES['files']['tmp_name']))
           
{
                 $count
= count($_FILES['files']['tmp_name']);
                 
for($i = 0; $i < $count; $i++)
                 
{
                           
if( $_FILES['files']['error'][$i] == 0 )
                         
{
                           
                            $tmpname
= $_FILES['files']['tmp_name'][$i];
                            echo $tmpname
.'<br>';
                           
                            $named
= $_FILES['files']['name'][$i];
                            echo $named
.'<br>';
                            $dat
= file_get_contents($tmpname);
                           
// echo $dat;
                            save_data_file
(9632, $line['ID'], $named, $dat);  
                            $line
['Файл'] = $named;
                            $mas
['Файл'] = $named;
                         
}
                 
}
               
           
}


#11 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 30 Июль 2014 - 09:32

Т.е. все переменные через echo выдают то что надо, но сохранения файла через save_data_file не происходит?

#12 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 30 Июль 2014 - 09:39

да переменные показывает, а сохранения нет - поле остается пустым

UPD: сейчас добился того что файл записывается но опять только 1 почему-то

Сообщение отредактировал aleks.goodcolor: 30 Июль 2014 - 09:41


#13 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 30 Июль 2014 - 10:18

Так может все таки массив неверно проходите, раз один файл нормально сохраняется? У меня других версий пока нет.

#14 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 30 Июль 2014 - 12:58

просмотрел все что можно - так и не понимаю почему так получается. Скажите пожалуйста если в цикле записывать в $line, то там останутся все записи или только последняя?

#15 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 30 Июль 2014 - 14:09

Если вы несколько раз перезаписываете одну и ту же переменную, естественно там останется только последнее значение. Нужно присоединять, а не заменять.

#16 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 30 Июль 2014 - 14:30

Не подскажите как можно присоединить?

#17 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 30 Июль 2014 - 15:09

В общем случае, берете текущее значение переменной и конкатенируете (присоединяете) новое значение к нему:

$text = $text."new_text";

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

$line['Файл'] = $line['Файл'] ? ($line['Файл']."\n".$named) : $named;


#18 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 30 Июль 2014 - 15:16

Данная запись не сработала - в поле файл пишется Array

Сообщение отредактировал aleks.goodcolor: 30 Июль 2014 - 15:16


#19 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 30 Июль 2014 - 15:20

Ну так значит в $named у вас array (массив). Вы раньше этого не знали разве? Или вы решили отказаться от прохода массива файлов и сразу писать весь массив в поле? Мой код вообще-то предназначался для тела цикла, а не для одновременной записи всех имен за один присест.

#20 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 30 Июль 2014 - 15:26

я вывожу в цикле - $named не должен быть массивом.
Вот код:

if(is_array($_FILES['files']['tmp_name']))
           
{
                 $count
= count($_FILES['files']['tmp_name']);
                 echo $count
;
                 
for($i = 0; $i < $count-1; $i++)
                 
{
                           
if( $_FILES['files[]']['error'][$i] == 0 )
                         
{
                           
                            $tmpname
= $_FILES['files[]']['tmp_name'][$i];
                            $named
= $_FILES['files[]']['name'][$i];
                            $dat
= file_get_contents($tmpname);
                save_data_file
(9632, $line['ID'], $named, $dat);  
                            $line
['Файл'] = $line['Файл'] ? ($line['Файл']."\n".$named) : $named;
                           
                         
}
                 
}






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных