Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как сделать кнопку загрузки активной, когда уже выбраны файлы для загрузки
 
 автор: Geoli   (26.07.2009 в 22:05)   письмо автору
 
 

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

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



<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' /> определяет суммарно для формы максимальный размер. Или нужно делить на пару и ставить перед каждой строкой по одному мегабайту?

  Ответить  
 
 автор: sim5   (26.07.2009 в 23:12)   письмо автору
 
   для: Geoli   (26.07.2009 в 22:05)
 

Почему вы решили, что пустое поле возвращает 0? MAX_FILE_SIZE - это максимальный размер загружаемого файла этим полем.

  Ответить  
 
 автор: Geoli   (27.07.2009 в 12:10)   письмо автору
 
   для: 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:35)   письмо автору
 
   для: Geoli   (27.07.2009 в 12:10)
 

Дополнительный вопрос. Если upload_max_filesize имеет ограничение в 2 мб. То это касательно суммы загрузки или каждого файла в отдельности. т.е. в скрытой форме

<input name='MAX_FILE_SIZE' value='1 048 576' type='hidden' />

указывать не 1 мб, а два?

  Ответить  
 
 автор: sim5   (27.07.2009 в 12:52)   письмо автору
 
   для: Geoli   (27.07.2009 в 12:35)
 

onchange="if (!document.getElementById('fileField2').value') .....


upload_max_filesize - это максимальный размер загружаемого файла, одного! Файлы не загружаются сразу все скопом, а по одному.
MAX_FILE_SIZE - это если вы по нему будете ориентироваться для проверки, а вообще можете не указывать это поле совсем, проку от него не так много на сервере.

  Ответить  
 
 автор: PAT   (27.07.2009 в 13:08)   письмо автору
 
   для: 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) вполне работоспособна и кроссбраузерна.
Насчёт "топорности" вы зря скромничаете: задача решена вами очень даже ЭЛЕГАНТНО.

  Ответить  
 
 автор: sim5   (27.07.2009 в 14:18)   письмо автору
 
   для: PAT   (27.07.2009 в 13:08)
 

Я ничего не придумывал, а всего лишь сказал автору, что это такое (РНР мануал):

Скрытое поле MAX_FILE_SIZE обязано предшествовать полю ввода файла/file input field, и его значение это максимальный размер принимаемого файла. Значение в байтах.

Предупреждение!
MAX_FILE_SIZE является для браузера лишь уведомляющим. Легко обойти этот максимум. Поэтому не рассчитывайте, что браузер будет повиноваться вашим желаниям! Однако PHP-установки maximum-size обмануть нельзя.

  Ответить  
 
 автор: PAT   (27.07.2009 в 14:50)   письмо автору
 
   для: sim5   (27.07.2009 в 14:18)
 

Скрытое поле MAX_FILE_SIZE обязано предшествовать полю ввода файла/file input field,
и его значение это максимальный размер принимаемого файла. Значение в байтах.
Предупреждение!
MAX_FILE_SIZE является для браузера лишь уведомляющим. Легко обойти этот максимум.

Чудо!
Где вы такой мануал нашли?
Ссылкой, если можно, не поделитесь?

Я вполне серьёзно.
Потому как просто НЕ ПРЕДСТАВЛЯЮ себе, как возможно утверждать "обязано предшествовать"
и тут же предупреждать, что это можно "легко обойти" :-)
Это равносильно старому анекдоту:
- Иванов!
- Я!
- Расстрелять!.. Петров!
- Я!
- Расстрелять!.. Рабинович!.. Рабинович?!
- Я тут. А извините - можно меня не расстреливать?
- Можно. Вычёркиваю... Сидоров!..
:-))

  Ответить  
 
 автор: sim5   (27.07.2009 в 15:08)   письмо автору
 
   для: PAT   (27.07.2009 в 14:50)
 

>Где вы такой мануал нашли?

Из официального мануала РНР. Интересно? Откройте и порчитайте, и не думайте, что я дурак, и не имею представление об этом поле. Анекдоты бабушке свой рассказывать будете.

  Ответить  
 
 автор: PAT   (27.07.2009 в 15:44)   письмо автору
 
   для: 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" />.
А вы восприняли разбор ПРИМЕРА как АБСОЛЮТНУЮ рекомендацию, т.е. БУКВАЛЬНО...
Что ж... бывает :-)


>"Анекдоты бабушке свой рассказывать будете"
Верно... вам анекдоты рассказывать НЕЛЬЗЯ.
Вы, как выяснилось, имеете особенность воспринимать всё БУКВАЛЬНО :-))

Ничего страшного... Бывает... И со мною такое было... Неоднократно причём... :-)

  Ответить  
 
 автор: sim5   (27.07.2009 в 16:32)   письмо автору
 
   для: PAT   (27.07.2009 в 15:44)
 

РАТ, что вы мне пытаетесь доказать? Чего я воспринял? Я привел автору кусок из мануала, и посоветовал забыть об MAX_FILE_SIZE, вот и все. В чем проблема?

  Ответить  
 
 автор: PAT   (27.07.2009 в 16:51)   письмо автору
 
   для: sim5   (27.07.2009 в 16:32)
 

Вам?
Совершенно ничего не пытаюсь доказывать.

Просто имею сказать, что вообще мануал по PHP написан не очень умными людьми.
Они не смогли разработать чёткую концепцию описания языка, не смогли разработать систему представления синтаксиса языка... Подменили строгие формулировки примерами. Вот народ и впадает в ересь :-)

Жаль, но случаи, когда люди САМОСТОЯТЕЛЬНО выводят синтаксис из примеров, в PHP встречаются очень часто. А далеко не все самостоятельно могут из фразы "пифагоровы штаны во все стороны равны" вывести правильное "сумма квадратов катетов равна квадрату гипотенузы" :-)

  Ответить  
 
 автор: sim5   (27.07.2009 в 17:18)   письмо автору
 
   для: PAT   (27.07.2009 в 16:51)
 

Ну.... Я так понимаю, что вас "возмущает" написание в мануале о следовании этого поля - обязательно впереди? Его можно воткнуть куда угодно, и кто понимает в формах, тот понимает это, но это не мои проблемы, у меня своих проблем хватает, и меня не интересует кто там пишет мануал. ;-)

  Ответить  
 
 автор: serjinio   (27.07.2009 в 14:44)   письмо автору
 
   для: 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" />

Хотя, как было сказано, это только рекомендации браузеру ..и не все их придерживаются...

  Ответить  
 
 автор: Geoli   (29.07.2009 в 01:19)   письмо автору
 
   для: serjinio   (27.07.2009 в 14:44)
 

Приношу извинения всем, т.к. моя тема вызвала негативные дебаты.
Всем спасибо.

sim5
Теперь ясно, что файлы не скопом повалят на сервер, а должны последовательно грузиться. Правда я думал, что ограничения действуют на форму, а не на поле. т.е. одна форма имеет право загрузить в сумме пакет в таком то объеме. Ошибался, исправился. :)
По поводу поля MAX_FILE_SIZE, и правда, вычитал в постах о том, что это рекомендация серверу, решил применить. Но теперь ясно, что нет необходимости.

PAT
ПО поводу элегантности решения, спасибо. Я правда думал, что еще элегантней было бы сделать скрипт, который что то умно там делал бы, а не простой тригер с перекрестной ссылкой.

И еще раз, MAX_FILE_SIZE для меня не критично. По поводу всего остального еще раз спасибо.

  Ответить  
 
 автор: sim5   (29.07.2009 в 06:20)   письмо автору
 
   для: Geoli   (29.07.2009 в 01:19)
 

Есть ограничения и на максимальный размер загружаемого методом POST, и это так же прописывается в php.ini. Запомните главное - вся "красивость" на клиенте, это всего лишь красивость, проверку всего и вся нужно делать на сервере, тем более, что загрузка файлов на сервер предполагает много проверок, и с этим вопросом в раздел РНР.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования