|
|
|
| Нужно сделать так, чтобы кнопка отправки формы стала активной только после того, как файлы выбраны. Форма предназначена для загрузки двух файлов.
сделал следующее, все кажется работает. Но хотелось бы, чтобы профи глянули своим не замылинным взглядом и сказали, все корректно? Или есть какие то ошибки.
<form id="form1" name="form1" enctype="multipart/form-data" method="post" action="">
<input type="file" name="fileField1" id="fileField1"
onchange="if (document.getElementById('fileField2').value != 0)
document.getElementById('button').disabled = false;" />
<input type="file" name="fileField2" id="fileField2"
onchange="if (document.getElementById('fileField1').value != 0)
document.getElementById('button').disabled = false;" />
<input type="submit" name="button" id="button" value="Submit" disabled="disabled" />
</form>
|
И может есть возможность сделать это красивей, а не топорно как сейчас.
И еще, стока <input name='MAX_FILE_SIZE' value='2 000 000' type='hidden' /> определяет суммарно для формы максимальный размер. Или нужно делить на пару и ставить перед каждой строкой по одному мегабайту? | |
|
|
|
|
|
|
|
для: Geoli
(26.07.2009 в 22:05)
| | Почему вы решили, что пустое поле возвращает 0? MAX_FILE_SIZE - это максимальный размер загружаемого файла этим полем. | |
|
|
|
|
|
|
|
для: sim5
(26.07.2009 в 23:12)
| | С нулем работает. Но это меня тоже смущало, почему и попросил подправить
Следовательно так правильно ?
<form id="form1" name="form1" enctype="multipart/form-data" method="post" action="">
<input name='MAX_FILE_SIZE' value='1 048 576' type='hidden' />
<input type="file" name="fileField1" id="fileField1"
onchange="if (document.getElementById('fileField2').value != '')
document.getElementById('button').disabled = false;" />
<input name='MAX_FILE_SIZE' value='1 048 576' type='hidden' />
<input type="file" name="fileField2" id="fileField2"
onchange="if (document.getElementById('fileField1').value != '')
document.getElementById('button').disabled = false;" />
<input type="submit" name="button" id="button" value="Submit" disabled="disabled" />
</form>
|
На счет кросплатформености проблем не должно быть? | |
|
|
|
|
|
|
|
для: Geoli
(27.07.2009 в 12:10)
| | Дополнительный вопрос. Если upload_max_filesize имеет ограничение в 2 мб. То это касательно суммы загрузки или каждого файла в отдельности. т.е. в скрытой форме
<input name='MAX_FILE_SIZE' value='1 048 576' type='hidden' />
указывать не 1 мб, а два? | |
|
|
|
|
|
|
|
для: Geoli
(27.07.2009 в 12:35)
| |
onchange="if (!document.getElementById('fileField2').value') .....
|
upload_max_filesize - это максимальный размер загружаемого файла, одного! Файлы не загружаются сразу все скопом, а по одному.
MAX_FILE_SIZE - это если вы по нему будете ориентироваться для проверки, а вообще можете не указывать это поле совсем, проку от него не так много на сервере. | |
|
|
|
|
|
|
|
для: Geoli
(27.07.2009 в 12:35)
| | Что-то вы, извиняюсь, фигнёй занимаeтесь.
По полной программе.
И, что удивительно, фигнёй заниматесь не один, а в компании :-)
1. Браузер ни HTML-способами, ни средствами Javascript'а НЕ МОЖЕТ определить размер файла, который будет выбран пользователем в <INPUT TYPE="file">.
Браузер всего лишь УКАЗЫВАЕТ ПУТЬ к выбранному пользователем файлу.
Поэтому все придуманные вами (вернее, коллегой sim5) ухищрения с MAX_FILE_SIZE и со скрытыми инпутами - совершенно БРАУЗЕРУ не нужны.
Тем паче, они не нужны серверу, потому как предусмотреть максимально допустимый размер скачиваемого файла можно (и нужно!) прямо в программе на PHP, коя будет обрабатывать форму.
2. По существу сверять значение value инпута надо не с нулём. Надо проверять значение value "на существование" - есть оно, или его нету. Т.е.:
вместо
if (document.getElementById('fileField1').value != 0) и if (document.getElementById('fileField2').value != 0)
надо прописать
if (document.getElementById('fileField1').value) и if (document.getElementById('fileField2').value)
| Хотя и с нулём сравнить, конечно, можно. Но можно и с тысячью. Или с числом ПИ... Разницы никакой нет :-)
3. Программа ваша (в первоначальном вашем виде, но с можно и ЛОГИЧЕСКИМ изменением, указанным мною выше в п.2) вполне работоспособна и кроссбраузерна.
Насчёт "топорности" вы зря скромничаете: задача решена вами очень даже ЭЛЕГАНТНО. | |
|
|
|
|
|
|
|
для: PAT
(27.07.2009 в 13:08)
| | Я ничего не придумывал, а всего лишь сказал автору, что это такое (РНР мануал):
Скрытое поле MAX_FILE_SIZE обязано предшествовать полю ввода файла/file input field, и его значение это максимальный размер принимаемого файла. Значение в байтах.
Предупреждение!
MAX_FILE_SIZE является для браузера лишь уведомляющим. Легко обойти этот максимум. Поэтому не рассчитывайте, что браузер будет повиноваться вашим желаниям! Однако PHP-установки maximum-size обмануть нельзя. | |
|
|
|
|
|
|
|
для: sim5
(27.07.2009 в 14:18)
| |
Скрытое поле MAX_FILE_SIZE обязано предшествовать полю ввода файла/file input field,
и его значение это максимальный размер принимаемого файла. Значение в байтах.
Предупреждение!
MAX_FILE_SIZE является для браузера лишь уведомляющим. Легко обойти этот максимум.
|
Чудо!
Где вы такой мануал нашли?
Ссылкой, если можно, не поделитесь?
Я вполне серьёзно.
Потому как просто НЕ ПРЕДСТАВЛЯЮ себе, как возможно утверждать "обязано предшествовать"
и тут же предупреждать, что это можно "легко обойти" :-)
Это равносильно старому анекдоту:
- Иванов!
- Я!
- Расстрелять!.. Петров!
- Я!
- Расстрелять!.. Рабинович!.. Рабинович?!
- Я тут. А извините - можно меня не расстреливать?
- Можно. Вычёркиваю... Сидоров!..
| :-)) | |
|
|
|
|
|
|
|
для: PAT
(27.07.2009 в 14:50)
| | >Где вы такой мануал нашли?
Из официального мануала РНР. Интересно? Откройте и порчитайте, и не думайте, что я дурак, и не имею представление об этом поле. Анекдоты бабушке свой рассказывать будете. | |
|
|
|
|
|
|
|
для: sim5
(27.07.2009 в 15:08)
| | >"и не думайте, что я дурак"
До последнего вашего сообщения дураком вас я не считал.
А вот после этого вашего последнего сообщения засомневался :-)
Я же написал вам, что прошу ссылку "вполне серьёзно".
Ну да ладно... ссылку я сам нашёл - http://ru2.php.net/manual/en/features.file-upload.post-method.php
Что сказать...
В мануале приведён ПРИМЕР - Example #1
В этом ПРИМЕРЕ приведён ОДИН ИЗ СПОСОБОВ сообщить PHP-интерпретатору - какой максимальный размер файла может загружаться.
И суть этого ПРИМЕРА разбирается: объясняется - ПОЧЕМУ скрытое поле в ПРИМЕРЕ должно предшествовать <input name="userfile" type="file" />.
А вы восприняли разбор ПРИМЕРА как АБСОЛЮТНУЮ рекомендацию, т.е. БУКВАЛЬНО...
Что ж... бывает :-)
>"Анекдоты бабушке свой рассказывать будете"
Верно... вам анекдоты рассказывать НЕЛЬЗЯ.
Вы, как выяснилось, имеете особенность воспринимать всё БУКВАЛЬНО :-))
Ничего страшного... Бывает... И со мною такое было... Неоднократно причём... :-) | |
|
|
|
|
|
|
|
для: PAT
(27.07.2009 в 15:44)
| | РАТ, что вы мне пытаетесь доказать? Чего я воспринял? Я привел автору кусок из мануала, и посоветовал забыть об MAX_FILE_SIZE, вот и все. В чем проблема? | |
|
|
|
|
|
|
|
для: sim5
(27.07.2009 в 16:32)
| | Вам?
Совершенно ничего не пытаюсь доказывать.
Просто имею сказать, что вообще мануал по PHP написан не очень умными людьми.
Они не смогли разработать чёткую концепцию описания языка, не смогли разработать систему представления синтаксиса языка... Подменили строгие формулировки примерами. Вот народ и впадает в ересь :-)
Жаль, но случаи, когда люди САМОСТОЯТЕЛЬНО выводят синтаксис из примеров, в PHP встречаются очень часто. А далеко не все самостоятельно могут из фразы "пифагоровы штаны во все стороны равны" вывести правильное "сумма квадратов катетов равна квадрату гипотенузы" :-) | |
|
|
|
|
|
|
|
для: PAT
(27.07.2009 в 16:51)
| | Ну.... Я так понимаю, что вас "возмущает" написание в мануале о следовании этого поля - обязательно впереди? Его можно воткнуть куда угодно, и кто понимает в формах, тот понимает это, но это не мои проблемы, у меня своих проблем хватает, и меня не интересует кто там пишет мануал. ;-) | |
|
|
|
|
|
|
|
для: Geoli
(27.07.2009 в 12:35)
| | можите автоматом назначить значение MAX_FILE_SIZE
function _Convert_Bytes( $size )
{
if ( is_numeric( $size)) return $size;
$ext = intval(substr( $size, 0, strlen( $size) - 1 ));
$n = strtolower( substr( $size, strlen( $size) - 1 ) );
switch ( $n )
{
case 'k': $ext *= 1024; break;
case 'm': $ext *= 1048576; break;
case 'g': $ext *= 1073741824; break;
}
return $ext;
}
$Max_Size=min( _Convert_Bytes(ini_get('upload_max_filesize')),
_Convert_Bytes(ini_get('post_max_size')),_Convert_Bytes(ini_get('memory_limit')) );
<input name="MAX_FILE_SIZE" value="<?php echo $Max_Size ?>" type="hidden" />
|
Хотя, как было сказано, это только рекомендации браузеру ..и не все их придерживаются... | |
|
|
|
|
|
|
|
для: serjinio
(27.07.2009 в 14:44)
| | Приношу извинения всем, т.к. моя тема вызвала негативные дебаты.
Всем спасибо.
sim5
Теперь ясно, что файлы не скопом повалят на сервер, а должны последовательно грузиться. Правда я думал, что ограничения действуют на форму, а не на поле. т.е. одна форма имеет право загрузить в сумме пакет в таком то объеме. Ошибался, исправился. :)
По поводу поля MAX_FILE_SIZE, и правда, вычитал в постах о том, что это рекомендация серверу, решил применить. Но теперь ясно, что нет необходимости.
PAT
ПО поводу элегантности решения, спасибо. Я правда думал, что еще элегантней было бы сделать скрипт, который что то умно там делал бы, а не простой тригер с перекрестной ссылкой.
И еще раз, MAX_FILE_SIZE для меня не критично. По поводу всего остального еще раз спасибо. | |
|
|
|
|
|
|
|
для: Geoli
(29.07.2009 в 01:19)
| | Есть ограничения и на максимальный размер загружаемого методом POST, и это так же прописывается в php.ini. Запомните главное - вся "красивость" на клиенте, это всего лишь красивость, проверку всего и вся нужно делать на сервере, тем более, что загрузка файлов на сервер предполагает много проверок, и с этим вопросом в раздел РНР. | |
|
|
|