Multipart-форма (проблема)

Статус
Закрыто для дальнейших ответов.

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
Решил сделать на сайте multipart-форму
Скрипт описанный в книжке Котерова работает(Фотоальбом). Но вот на моём локальном сайте нивкакую не собирается загружаться.
Вот код
Код:
if(@$_GET['l']=="addtop"){
$edit ="<br>
<center><h3>Добавлениие темы</h3></center>
 <table class='pravka' align='center' width=60% > 
 <tr>
  <form action='admin.php?n=razdel&l=adtop&i=".$_GET['k']."' method='POST' enctype='multipart/form-data'>
  <td>Заголовок:</td>
  <td><input type='text' SIZE=60 name='name' value=''></td> 
 </tr>
 <tr>
  <td>Сообщение:</td>
  <td><textarea rows='15' cols='56' name='text'></textarea></td> 
 </tr>
 <tr>
  <td>Источник:</td>
  <td><input type='text' SIZE=60 name='ist' value=''></td> 
 </tr>
   <tr>
  <td>Картинка:</td>
  <td><input type='file' name='File'></td> 
 </tr>
 <tr>
  <td colspan=2 align=center><input  type='submit' name='doUpload' value='Создать новость'></td>
  </tr>
  </form>
 </table>

";
echo $edit;
}


if(@$_GET['l']=="adtop"){ 
$text=str_replace("\n","<br>",$_POST['text']);
mysql_query("INSERT INTO razdel SET id_navigat='$_GET[i]', name='$_POST[name]', author='$_COOKIE[admin]', ist='$_POST[ist]', date='$date', datetime='$datet', text='$text', time='$time'");
$id=mysql_insert_id();
$ImgDir="../images/img";
@mkdir($ImgDir,666);
echo $File."<br>";
if(file_exists($File))
{
echo $POST['File_name'];
if(ereg("^(.*)\\.(gif|jpg|png)$",$File_name,$P))
{
Copy($File,"$ImgDir/".$id.".jpg");
}
}
Header("Location: admin.php?n=razdel");
exit;
}
Долго мучался и определи, что не создаётся переменная $File
Помогите, жду вашей помощи!
 

~FisHBonE~

Well-Known Member
Регистрация
23.05.2005
Сообщения
136
Хм... Что-то я вообще не нашел объявления переменной $File :)
Код:
$File = $_FILES['File'];
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
За это спасибо! Но возникла следующая проблема.
Я не могу вытащить саму переменную $_FILES['File'], когда я её печатаю, мне пишет array(т.е. массив)
И поэтому не работает функция file_exists(), выдаёт предупреждение
Notice: Array to string conversion in k:\home\localhost\www\sportingnews2\admin\news.php on line 230
Всё остальное можно вытащить через двумерный массив, например.
Код:
$File_name = $_FILES['File']['name'];
Как я понял функция file_exists() проверяет наличие файла в данный момент, если вместо $File в функцию подставить $File_name(после определения), функция не идёт.
А как же сама переменная файл, как её получить?
 

~FisHBonE~

Well-Known Member
Регистрация
23.05.2005
Сообщения
136
Когда приходит файл из мультипарт формы, он сначала размещается во временной папке. Ему PHP присваивает временноге имя. Что бы файл попал в указанное место надо его забрать из временного хранилища.
Для этого пишем:
Код:
copy ($_FILES['File']['tmp_name'], 'место загрузки');
Т.е. имя временного файла хранится в $_FILES['your_file']['tmp_name'].
А вообще, полезно будет почитать вот это http://ru.php.net/manual/ru/features.file-upload.php :)
 

deMone

Злой страшный дядька
Регистрация
30.01.2006
Сообщения
937
Не copy, а move_uploaded_file.
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
2deMone: Не copy, а move_uploaded_file. А в чём разница? Объясни тогда!

2~FisHBonE~:Спасибо тебе большое за помощь, а то я уже было разочаровался в multipat формеЕсли будут ещё какие вопросы напишу.

Off: тему прошу не закрывать!
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
Вот и возникли траблы! :mad: на локалке всё работало, а в инете не хочет, новость добавляется, но без картинки, почему?

Код:
if(@$_GET['l']=="adtop"){ 
$text=str_replace("\n","<br>",$_POST['text']);
mysql_query("INSERT INTO razdel SET id_navigat='$_GET[i]', name='$_POST[name]', author='$_COOKIE[admin]', ist='$_POST[ist]', date='$date', datetime='$datet', text='$text', time='$time'");
$id=mysql_insert_id();
$ImgDir="../images/img";
$File_name = $_FILES['File']['name'];
if(file_exists($_FILES['File']['tmp_name']))
{
if(ereg("^(.*)\\.(gif|jpg|png)$",$File_name,$P))
{
Copy($_FILES['File']['tmp_name'],"$ImgDir/".$id.".".$P[2]);
}
}
Header("Location: admin.php?n=razdel");
exit;
}
Помогите!
 

deMone

Злой страшный дядька
Регистрация
30.01.2006
Сообщения
937
А в чём разница не мешало бы почитать в документации.
move_uploaded_file кроме прочего проверяет, был ли файл действительно загружен или это подделка запроса на загрузку файла.
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
Без разницы какую функцию использовать, всё раввно скрипт не работает, не понимаю где моя ошибка, подскажите!
Скрипт выше
 

~FisHBonE~

Well-Known Member
Регистрация
23.05.2005
Сообщения
136
Надо проверить следующие директивы в php.ini у хостера:
file_uploads = On
upload_max_filesize = 2M

Первая разрешает загрузку файлов, вторая указывает максимальный размер файла.
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
file_uploads=On
upload_max_filesize=8M
Я точно не знаю для какого это хочтинга(платного или бесплатного), но вот то что register_globals=On
Это странно, у меня вроде off на хостинге.

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

Может кто использовал джино-нет(бесплатный), подскажите, какие настройки у них стоят!
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
Кстати, я тут в книге вычитал,что с помощью файла .htaccess можно поменять конфигурации, возможно ли это?
Правда в faq по jino-net написано, что изменение add_Type может привести к плохим последствиям?

Можете помочь разобраться с загрузкой файлов, можно ли обйти конфигурации сервера!
 

medwoodu

Злобный модер
Регистрация
22.12.2005
Сообщения
1 418
Кстати, я тут в книге вычитал,что с помощью файла .htaccess можно поменять конфигурации, возможно ли это?
Правда в faq по jino-net написано, что изменение add_Type может привести к плохим последствиям?

Можете помочь разобраться с загрузкой файлов, можно ли обйти конфигурации сервера!
Можно менять некоторые конфигурации, если PHP установлен не как CGI. Возможности зависят от настроек хостера.
php_value session.use_trans_sid 0 например такой код запрещает писать идентификатор сессии в строку запроса
 

~FisHBonE~

Well-Known Member
Регистрация
23.05.2005
Сообщения
136
Сомневаюсь, что на бесплатном Jino-net можно менять директивы php.ini с помощью .htaccess. Хотя, в вопросах настройки я понимаю не много.
Есть еще функция ini_set, с ее помощью можно попробывать, но не могу сказать можно ли с ее помощью менять директивы, управляющие загрузкой файлов.
 

sciko

Well-Known Member
Регистрация
22.12.2006
Сообщения
164
Сомневаюсь, что на бесплатном Jino-net можно менять директивы php.ini с помощью .htaccess.
Прочти ещё раз документацию на джине! Кое-что можно!

А теперь мой вопрос в догонку:
У меня при аплоаде бьются файлы картинок. Точнее все коды х00 ("пустой символ") меняются на х20 ("пробел"). Судя по всему это фильтр POST запросов. Доступа к php.ini нет. Вопрос: Что делать?
 

medwoodu

Злобный модер
Регистрация
22.12.2005
Сообщения
1 418
А теперь мой вопрос в догонку:
У меня при аплоаде бьются файлы картинок. Точнее все коды х00 ("пустой символ") меняются на х20 ("пробел"). Судя по всему это фильтр POST запросов. Доступа к php.ini нет. Вопрос: Что делать?
На вскидку, могу ошибаться, читать доки про передачу данных, у вас похоже передается файл как текстовый а не как двоичный.
Код в студию
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
sciko там написано только про FTP, а я пытаюсь сделать через multipart форму цитирую
Размер файлов, закачиваемых через контрольную панель, ограничен — 2 МБ. Через FTP можно закачивать файлы любого размера, не превышающего количество свободного места на вашем сайте.
Если вы не это имели ввиду, прошу вас процитировать, сколько не искал, ничего не нашёл подходящего
 

Vita$

Новичок
Регистрация
26.03.2007
Сообщения
4
Еще права доступа на папку куда загружаешь файлы должны быть 777.
 

ZitosS_32

Совесть
Регистрация
12.03.2006
Сообщения
852
Vita$ thanks тебе, я просто думал что хватало chmad 755
А оказалось, что надо 777 :biggrin:
Ещё раз огромное СПАСИБО!
 

sciko

Well-Known Member
Регистрация
22.12.2006
Сообщения
164
Собственно код (правда не полностью, но суть ясна):
Код:
function upload_items($dir) {		// upload file
	if(($GLOBALS["permissions"]&01)!=01) show_error($GLOBALS["error_msg"]["accessfunc"]);
	
	// Execute
	if(isset($GLOBALS['__POST']["confirm"]) && $GLOBALS['__POST']["confirm"]=="true") {	
		$cnt=count($GLOBALS['__FILES']['userfile']['name']);
		$err=false;
		$err_avaliable=isset($GLOBALS['__FILES']['userfile']['error']);
	
		// upload files & check for errors
		for($i=0;$i<$cnt;$i++) {
			$errors[$i]=NULL;
			$tmp = $GLOBALS['__FILES']['userfile']['tmp_name'][$i];
			$items[$i] = stripslashes($GLOBALS['__FILES']['userfile']['name'][$i]);
			if($err_avaliable) $up_err = $GLOBALS['__FILES']['userfile']['error'][$i];
			else $up_err=(file_exists($tmp)?0:4);
			$abs = get_abs_item($dir,$items[$i]);
		
			if($items[$i]=="" || $up_err==4) continue;
			if($up_err==1 || $up_err==2) {
				$errors[$i]=$GLOBALS["error_msg"]["miscfilesize"];
				$err=true;	continue;
			}
			if($up_err==3) {
				$errors[$i]=$GLOBALS["error_msg"]["miscfilepart"];
				$err=true;	continue;
			}
			if(!@is_uploaded_file($tmp)) {
				$errors[$i]=$GLOBALS["error_msg"]["uploadfile"];
				$err=true;	continue;
			}
			if(@file_exists($abs)) {
				$errors[$i]=$GLOBALS["error_msg"]["itemdoesexist"];
				$err=true;	continue;
			}
			
			// Upload
			if(function_exists("move_uploaded_file")) {
				$ok = @move_uploaded_file($tmp, $abs);
			} else {
				$ok = @copy($tmp, $abs);
				@unlink($tmp);	// try to delete...
			}
...................
Дальше не интересно.
У меня сильное подозрение, что стоит русский апач. Но вылечить его добавлением строки
Код:
CharsetRecodeMultipartForms off
в файл .htaccess нет возможности, т.к. провайдер его мне не разрешает.
Рассмотрю любые варианты :happy:
 
Статус
Закрыто для дальнейших ответов.
Верх Низ