Снова UPLOAD. Сдаюсь. Помогайте.

telesar

Новичок
Снова UPLOAD. Сдаюсь. Помогайте.

Две недели я пытался изучить этот вопрос и освоить UPLOAD самостоятельно. Я прочитал многое из того, что доступно, некоторые вещи по несколько раз. Не получается.
Значит, ситуация следующая:
1) Через форму заливается файл (картинка).
2) Через getimagesize проверяем ее валидность.
3) Записываем ссылку на файл в БД, получаем имя, под которым надо сохранить этот файл (имя_файла=автоинкремент. поле)
4) Через move_uploaded_file записываем файл в нужный каталог.

И все бы хорошо, да только getimagesize не работает, пока файл лежит во временной папке (open_basedir, знаете ли, не дает).
Получается, что getimagesize должен идти последним пунктом.
Но если картинка окажется инвалидной, придется ее стирать, удалять из базы строчку (а значение автоинкремент. поля уже вообще не восстановишь, ну это так, к слову...).
Не красиво... К тому же в http://detail.phpclub.net/article/upload прямо сказано:
Не стоит изобретать велосипед и работать самому с временными файлами, копировать их, удалять. Это уже сделано до Вас и для Вас.
Что же делать?
Добавление в .htaccess строчки
php_value upload_tmp_dir "/home/telesar/tmp" - не дает никакого эффекта;
php_admin_value upload_tmp_dir "/home/telesar/tmp" - дает 500 Internal Server Error, Error Log сообщает, что php_admin_value не допустим...

ini_set нужные мне параметры изменить не может, php.ini - для меня недоступен. Хостера не стоит даже пытаться озадачить (это печально известный Dinohost).
Добило же меня то, что сегодня аплоад вообще перестал работать: файл не загружается, массив $_FILES не создается, включение error_reporting(E_ALL) приводит к появлению доброжелательного сообщения:
Notice: Undefined index: avatara in /home/telesar/public_html/forum/regobrab.php on line 3 (в третьей строке стоит: print_r($_FILES['avatara']);)
И что делать дальше ?...

phpinfo() сообщает такие подробности:
file_uploads On
open_basedir /home/telesar:/usr/lib/php:/usr/local/lib/php:/tmp
post_max_size 55M
safe_mode Off
upload_max_filesize 2M
upload_tmp_dir no value
user_dir no value
max_input_time -1 (кстати, что это?, это так и должно быть?)

И вот еще такая подробность: вчера phpinfo(), запущенный из remview_2003_10_23, сказал мне, что
_SERVER["HTTP_REFERER"] http://www.searchpirates.ca/chat/info.php. С чего бы это, а?
 

AHTIXPICT

Новичок
$_FILES

getimagesize можно делать любым пунктом.

$attach = $_FILES['attach'];
$pict = getimagesize($attach['tmp_name']);
 

SiMM

Новичок
Re: Снова UPLOAD. Сдаюсь. Помогайте.

Автор оригинала: telesar
1) Через форму заливается файл (картинка).
2) Через getimagesize проверяем ее валидность.
3) Записываем ссылку на файл в БД, получаем имя, под которым надо сохранить этот файл (имя_файла=автоинкремент. поле)
4) Через move_uploaded_file записываем файл в нужный каталог.
Получается, что getimagesize должен идти последним пунктом.
Получается, что move_uploaded_file идёт 2м пунктом, сдвигая всё ниже.
 

telesar

Новичок
Re: Re: Снова UPLOAD. Сдаюсь. Помогайте.

AHTIXPICT

$attach = $_FILES['attach'];
$pict = getimagesize($attach['tmp_name']);
Нельзя, open_basedir не дает доступа к врем. папке.


SiMM
Получается, что move_uploaded_file идёт 2м пунктом, сдвигая всё ниже.
Как же я узнаю имя, под которым сохранять файл?
 

telesar

Новичок
Автор оригинала: SiMM
Что значит как? Точно так же, как и сейчас.
Не понял. Имя файла я определяю в пункте 3. Мне его сохранять, а потом переименовывать, что ли?
 

telesar

Новичок
Ну хорошо. И как тогда быть с инвалидными файлами?
А что можно сделаь с неработающим аплоадом?
 

IntenT

SkyDiver
telesar
так у тебя аплоадятся файлы или нет?
И что тебе мешает сначала проверять валидность, а потом создавать сапись в бд?
 

Seagor

Guest
попробуй посмотреть, может поможет

$max_image_width = 380;
$max_image_height = 600;
$max_image_size = 500 * 1024;
$valid_types = array("jpg","jpeg");

if ($Foto1 != '') {
if (is_uploaded_file($_FILES['Foto1']['tmp_name'])) {
$filename = $_FILES['Foto1']['tmp_name'];
$ext = substr($_FILES['Foto1']['name'], 1 + strrpos($_FILES['Foto1']['name'], "."));
if (filesize($filename) > $max_image_size) {
$alert="Ошибка: файл Фото 1 превышает 500 Kилобайт.";
$res=1;
}
elseif (!in_array($ext, $valid_types)) {
$alert="Ошибка: файл Фото 1 поврежден.";
$res=1;
}
else {
$size = GetImageSize($filename);
if (($size) && ($size[0] < $max_image_width) && ($size[1] < $max_image_height)) {
if (@move_uploaded_file($filename, $PhotoNew."/"."$WomanID"."-1.".jpg)) {
}
else {
$alert="Ошибка: не получилось загрузить Фото 1.";
$res=1;
}
} else {
$alert="Ошибка: Фото 1 имеет неправильный формат.";
$res=1;
}
}
 

SiMM

Новичок
Автор оригинала: telesar
Ну хорошо. И как тогда быть с инвалидными файлами?
А что ты раньше делал с инвалидными файлами? ;)
А что можно сделаь с неработающим аплоадом?
Разбираться с ним отдельно, чтобы убедиться, что он действительно не работает. В этом может помочь практически слизанный из мануала пример
PHP:
<? // upload.php
  ini_set('display_errors',1);
  error_reporting(E_ALL);
  if (!isset($_FILES) || !count($_FILES)) echo <<<HTML
<form enctype="multipart/form-data" action="{$_SERVER['REQUEST_URI']}" method="post">
 <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
 Send this file: <input name="userfile" type="file" />
 <input type="submit" value="Send File" />
</form>
HTML;
  else{
    $uploaddir = dirname($_SERVER['SCRIPT_FILENAME']).'/';
    $uploadfile = $uploaddir . $_FILES['userfile']['name'];
    echo "<pre>";
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
       echo "File is valid, and was successfully uploaded. ";
    else echo "Possible file upload attack! ";
    echo "Here's some debugging info:\n";
    print_r($_FILES);
    echo "</pre>";
  }
?>
 

telesar

Новичок
Seagor
По твоему примеру у меня есть замечания:
1. GetImageSize не работает с врем. папкой (у меня).

2. Вызывать функцию filesize для только что заапложенного файла - лишний раз нагружать сервер - для этого есть
$_FILES['atach']['error']=2
и $_FILES['atach']['size']

3. Проверять тип файла по его расширению на компе Юзера - это все равно, что и вообще его не проверять

4. Сохранять файлы под оригинальными именами мне не подходит - у нескольких Юзеров они могут совпасть.
Это так, навскидку.

IntenT
так у тебя аплоадятся файлы или нет?
Вчера аплоадились, сегодня нет, завтра или когда-нибудь, надеюсь, опять будут
И что тебе мешает сначала проверять валидность, а потом создавать сапись в бд
Я по-моему, написал, что мешает (open_basedir).
 

Seagor

Guest
У меня все работает.
В моем случае он сохраняется под номером где
номер=последний номер+1
 

IntenT

SkyDiver
telesar
И что тебе мешает сначала проверять валидность, а потом создавать сапись в бд
копировать себе, потом проверять валидность, а потом писать в бд. неужели до этого так сложно додуматься???
Вчера аплоадились, сегодня нет, завтра или когда-нибудь, надеюсь, опять будут
тоесть ты даже незнаешь причины почему не аплоадится???
ну-ну, надейся.. можешь еще помолиться.. а еще говорят святая вода помогает
 

Seagor

Guest
У тебя включен режим отображения ошибок??
 

telesar

Новичок
Seagor
По поводу сохранения под оригинальными именами я ошибся, приношу извинения. По всем остальным замечаниям согласен?
У тебя включен режим отображения ошибок??
Включен, читай внимательно первый пост.


2 ALL
Может, я недостаточно ясно все обрисовал в первом посте, но в нем содержатся два независимых вопроса. Так уж вышло, что хотел спросить одно, а пришлось два. Итак, еще раз:
1) Первый вопрос родился, когда у меня (у хостера, у браузера, etc.) все работало. Попробую его сформулировать одним предложением: Как обеспечить достоверную валидацию заапложиваемой картинки в условиях, когда временная папка не входит в число обозначенных директивой open_basedir, доступа к конфиг. файлам нет, и при этом не использовать команду удаления инвалидных файлов? В принципе, я догадываюсь, что это не возможно, но хотелось бы услышать подтверждение от гуру, которые любят отсылать на главу UPLOAD из пирамидинского перевода с понравившейся мне фразой:
Не стоит изобретать велосипед и работать самому с временными файлами, копировать их, удалять. Это уже сделано до Вас и для Вас.
2) Второй вопрос родился, когда у меня (у хостера, у браузера, etc.) перестал работать аплоад. То есть не то что бы файлы не грузились, а вообще он упал. Совсем. Абсолютно. Подробности я сообщил в первом посте темы. Массив $_FILES не создается, is_uploaded_file не говорит ни TRUE, ни FALSE.


SiMM
Спасибо. Твой
практически слизанный из мануала пример
с чудовищным синтаксисом дал мне лишь одну полезную функцию, которую я не пробовал: ini_set('display_errors',1). Но из уважения к Санитару PHPClubа я поправил ошибки и запустил его. О выдает на экран лишь форму. Ни ошибок, ни сообщений он не выдает. Т.е. move_uploaded_file не равен ни TRUE, ни FALSE.
 

SiMM

Новичок
Автор оригинала: telesar
SiMM
Спасибо. Твой практически слизанный из мануала пример с чудовищным синтаксисом
В каком это месте он чудовищен? ;)
дал мне лишь одну полезную функцию, которую я не пробовал: ini_set('display_errors',1). Но из уважения к Санитару PHPClubа я поправил ошибки и запустил его.
Какую? И, кстати, всё это описано в PHP FAQ: Ничего не работает! Что делать???
О выдает на экран лишь форму. Ни ошибок, ни сообщений он не выдает. Т.е. move_uploaded_file не равен ни TRUE, ни FALSE.
Вывод абсолютно неверный, отсюда следует следующий вопрос - версия PHP?
 

Фанат

oncle terrible
Команда форума
Блин, я такой ответ писал красочный.
В своем стиле. (кто знает - поймет)
И тут мне кровать привезли.
Нажал на кнопку не глядя =(

-~{}~ 22.10.04 14:13:

php_value upload_tmp_dir "/home/telesar/tmp" - не дает никакого эффекта;
права?

-~{}~ 22.10.04 14:14:

UPLOAD из пирамидинского перевода
ты его в глаза хоть видел?
 

Фанат

oncle terrible
Команда форума
И где там написано "Александр Пирамидин"?
Если ты всё делаешь с такой же внимательностью и предвзятостью, то я удивляюсь, как у тебя вообще хоть что-то заработало

-~{}~ 22.10.04 14:44:

Кроме этого я тебе еще один вопрос задал.
потрудись ответить
 
Сверху