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


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


Сообщений в теме: 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 688 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 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 688 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 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 688 сообщений
  • Пол:Мужчина
  • Город:Казань

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

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

#7 CbCoder

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

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

Отправлено 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 688 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 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 688 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 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 688 сообщений
  • Пол:Мужчина
  • Город:Казань

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

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

#14 aleks.goodcolor

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

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

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

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

#15 CbCoder

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

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

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

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

#16 aleks.goodcolor

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

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

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

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

#17 CbCoder

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

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

Отправлено 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 688 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 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 анонимных