проблема upload'a

DeSeO

Guest
Тахе проблема, но только есть картинки которые загружаутся, а есть которые нет...
когда я тестил скрипт у меня не проходят некоторые картинки, размер, время, права доступа, имя файла, всё совпадает с оригиналом, но вот сама картинка подгружается битая... и что с этом делать я не понимаю... никаких прокси и роутеров у меня не стоит... сервер локальный (apache+php+mysql стоят на одной машине на localhost) кто знает прошу помочь...
форма:
--------------------------------------------------------
<form enctype="multipart/form-data" action="<?echo $_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']?>" method=post>
<input type=file name='image' size='5'>
<input type=submit value='&Auml;&icirc;&aacute;&agrave;&acirc;&egrave;&ograve;&uuml;'>
</form>
----------------------------------------------------------
Скрипт:
----------------------------------------------------------
if ($_FILES['image']['name']==""){echo "Файл не существует";}else{$ex=explode("/",$_FILES['image']['type']);
if($ex[0]=="image" and ($ex[1]=="gif" or $ex[1]=="jpeg" or $ex[1]=="pjpeg")){
if (is_uploaded_file($_FILES['image']['tmp_name'])){
$ftmp = $_FILES['image']['tmp_name'];
$file = "./imgdi/".$_FILES['image']['name'];
copy($ftmp, $file);}else{echo "Файл не загружен.";}}else{echo "Неверный тип файла.".$ex[1];}
 

DeSeO

Guest
От апача это не зависит, так как скрипт тестировался на 3 разных серверах, включая локальный, на
-------
<Location />
CharsetRecodeMultipartForms Off
</Location>
-------
apache реагирует ошибкой (не верная запись).
. Размер картинки 564kb, разрешение 97*118 точек, время закачки причиной быть не может т.к. проблема возникает и на локальном сервере (без использования интернет), а насчёт формы поясняю: цитата "Опция MAX_FILE_SIZE является рекомендацией браузеру" - это не обязательный параметр, который некоторые браузеры не воспринимают.
 

SiMM

Новичок
> MAX_FILE_SIZE - это не обязательный параметр, который некоторые браузеры не воспринимают.
А при чём тут браузер?
PS: ВСЁ, что нужно, есть в статье в деталях.
 

DeSeO

Guest
Притом, что MAX_FILE_SIZE в поле <input type=hidden> даёт рекомендацию браузеру, а не php: если файл будет превышать размер указанный в байтах в поле "value", то то файл не будет отправлен через http протокол . Для интерпретатора php MAX_FILE_SIZE задаётся в php.ini
 

SiMM

Новичок
> Притом, что MAX_FILE_SIZE в поле <input type=hidden> даёт рекомендацию браузеру
Назовите хоть один браузер, которому он что-то даёт :)

> Для интерпретатора php MAX_FILE_SIZE задаётся в php.ini
Мужик, ты путаешь мух с котлетами. И главное совершенно непонятно твоё абсолютно бессмысленное упорство - вместо того, чтобы сделать так, как надо, немножко исправив код, ты сидишь и ведёшь философские беседы о смысле жизни.
Можешь продолжать в том же духе - но лично я тебя больше уговаривать не буду - мне, собственно, по барабану.

Для особо внимательных цитирую официальную доку
[m]features.file-upload[/m]
Скрытое поле MAX_FILE_SIZE(значение необходимо указывать в байтах) должно предшествовать полю для выбора файла, и его значение является максимально допустимым размером принимаемого файла.
...
Вы в любом случае должны добавлять переменную формы MAX_FILE_SIZE
+ bonus
[m]features.file-upload#54778[/m]
the MAX_FILE_SIZE hidden input is simply ignored in current browsers, including Firefox 1.0+, Internet Explorer 6 and Opera 8.
 

DeSeO

Guest
У меня к тебе один вопрос ты когда-нибудь занимался программиированием вообще? И понимаешь, что я тебе хочу сказать??? Для особо одарённых повторяю в 4-ый раз: предыстория : в интернет используется так называемая система клиент-сервер. Клиент- браузер, сервер- apache, и существует php интерпретатор подключаемый к серверу (в данном случае apache) в качестве модуля при компиляции или как cgi приложения (в качестве exe приложения). Далее рассмотим форму:
-------------------------------------------
<form enctype="multipart/form-data" action="_url_" method=post>
<input type=hidden name="MAX_FILE_SIZE" value="size">
<input type=file name='image' size='5'>
<input type=submit value="send file">
</form>
-------------------------------------------
и скрипт обработки:
-------------------------------------------

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>
---------------------------------------
Скрипт взят с твоего любимого php.net

Сразу хочу заметить, что ни о какой переменной MAX_FILE_SIZE в скрипте обработке файла речи не идёт.

Далее переходим к схеме клиент-сервер:
запрос идет таким образом:
(схема 1)
(шаг 1) (шаг 2) (шаг 3)
клиент(браузер) ---> сервер (apache) ---> Запришиваемый файл
|
|-<->PHP
Обработка идёт в обратном порядке:

(схема 2)
(шаг 1) (шаг 2) (шаг 3)
Запрашиваемый файл ---> сервер (apache) ---> Клиент (браузер)
|
|-<->PHP

Так вот, обработка формы идет по схеме 1 на шаге 1. И посылая запрос, браузер просто отфильтровывает файлы по размеру большие, чем укзанный размер в вышеупомянутом теге, и MAX_FILE_SIZE, указанный в <input>, к PHP вообще никакого отношения не имеет. И далее следует фраза из документации целиком:

"Вы в любом случае должны добавлять переменную формы MAX_FILE_SIZE, так как она предотвращает тревожное ожидание пользователей при передаче огромных файлов, только для того, чтобы узнать, что файл слишком большой и передача фактически не состоялась."

ЧТОБЫ ОТФИЛЬТРОВАТЬ БОЛЬШИЕ ФАЙЛЫ ЕЩЁ ДО ЗАГРУЗКИ ЕГО НА СЕРВЕР, Т.К PHP ТОЖЕ ПРОВЕРЯЕТ РАЗМЕР ОТОСЛАННЫХ ДАННЫХ, НО УЖЕ ПОСЛЕ ПОЛУЧЕНИЯ ИХ СЕРВЕРОМ, И ОБРАБОТКА ПРОИСХОДИТ НА ШАГЕ 2 СХЕМА 2!
И ТОЛЬКО ДЛЯ ЭТОГО!!!!!

Советую либо купить очки, либо сменить мозги и больше читать умные книжки...
 

SiMM

Новичок
> MAX_FILE_SIZE, указанный в <input>, к PHP вообще никакого отношения не имеет
Бред нести прекращайте. Как к CGI - да, это даже логично (хотя отношение он всё равно имеет), как к модулю:
This form element should always be used as it saves users the trouble of waiting for a big file being transferred only to find that it was too big and the transfer failed.
+ [m]features.file-upload.errors[/m]

> ЧТОБЫ ОТФИЛЬТРОВАТЬ БОЛЬШИЕ ФАЙЛЫ ЕЩЁ ДО ЗАГРУЗКИ ЕГО НА СЕРВЕР
Я ещё раз повторяю. Назовите мне хотя бы один клиент, который это делает, а потом дайте ссылку на спецификацию HTML, где об этом написано хотя бы одно слово.

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

> Т.К PHP ТОЖЕ ПРОВЕРЯЕТ РАЗМЕР ОТОСЛАННЫХ ДАННЫХ, НО УЖЕ ПОСЛЕ ПОЛУЧЕНИЯ ИХ СЕРВЕРОМ
Разве я это отрицал? По моему, я утверждал, что это единственно возможный вариант.
 

DeSeO

Guest
МЛИН, я ща начну ругаться матом!

Этот кусок взят с http://php.rinet.ru/manual/ru/features.file-upload.php.

Внимание

Опция MAX_FILE_SIZE является рекомендацией браузеру, даже если бы PHP также проверял это условие. Обойти это ограничение на стороне браузера достаточно просто, следовательно, вы не должны полагаться на то, что все файлы большего размера будут блокированы при помощи этой возможности. Тем не менее, ограничение PHP касательно максимального размера обойти невозможно. Вы в любом случае должны добавлять переменную формы MAX_FILE_SIZE, так как она предотвращает тревожное ожидание пользователей при передаче огромных файлов, только для того, чтобы узнать, что файл слишком большой и передача фактически не состоялась.

А теперь подробно рассмативаем, что говориться в 1 строчке:

Опция MAX_FILE_SIZE является рекомендацией браузеру, даже если бы PHP также проверял это условие.

Особо обращаем внимание на слова "является рекомендацией браузеру" я уж и не знаю как выделить слово БРАУЗЕУ, у PHP есть
сходная функция и из-за того, что названия у них одинаковые и возникает путаница. В вышеуказанном предупреждении говориться о том, что эта функция позволяет пользователю сберечь время на загрузке файлов не подходящих по размеру! Т.к. обращаясь к схеме 2, описанной мной, PHP позволяет проверить размер файла только после его загрузки на сервер т.к . передача файла идет вместе с текстовой информацией формы ( схема 2 шаг 1 --> 2 именно тут PHP получает информацию от формы...) Для проверки советую воспользоваться экспериментальным способом: загрузить в фотму файл больший, чем указали в <input> и попробовать с помощью переменной $_FILE что-нибудь с ним сделать... Как говориться: семь раз отмерь - один раз отрежь... (я к тому, что следовало бы сначала разобраться)
 

Фанат

oncle terrible
Команда форума
заканчиваем беседу.
добро бы эта опция имела хоть какое-то отношение к проблеме.
а так, говорят об одном и том же, без смысла, и с горячностью.

DeSeO
вспоминай, о чём топик был сначала.
ты все проблемы решил?
 

SiMM

Новичок
[m]features.file-upload#54778[/m]
> я к тому, что следовало бы сначала разобраться
Вот и следуйте.
PS: вообще читать лучше первоисточники. http://www.php.ru/manual/en/features.file-upload

PPS: а тему наверно имеет смысл разбить и в мусор.
 

Фанат

oncle terrible
Команда форума
SiMM
Если я правильно помню, пхп без неё либо вообще не работает, либо, если уж работает, то обрабатывает всё подряд. разве нет?


DeSeO
чем орать - лучше бы взял, да попробовал.
разработчики пхп часто выкидывают шутки, которые простой логикой не понять.
 

SiMM

Новичок
> Если я правильно помню, пхп без неё либо вообще не работает
Я вот тоже почему-то так помнил. Однако сейчас попробовал на 4.3.11 - отсутсвие этого поля ничего не значит. А вот присутствие - да, влияет. На то, на что и следовало.

> разработчики пхп часто выкидывают шутки, которые простой логикой не понять.
+ кривые переводы.
 

SiMM

Новичок
> так у него ж отсутствует, вроде?
Значит, насчёт обязательного его наличия - заблуждался, признаю. Однако меня возмущал другой факт: "это поле используют браузеры ... к PHP оно никакого отношения не имеет"
 

Фанат

oncle terrible
Команда форума
вот я о том и говорю.
что спор на пустом месте =)
Но в этом вопросе он таки да- заблуждается, теоретик фигов =)
 
Сверху