Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Проверка типа файла перед отправкой (https://javascript.ru/forum/dom-window/28633-proverka-tipa-fajjla-pered-otpravkojj.html)

mav1 27.05.2012 17:07

Проверка типа файла перед отправкой
 
Здравствуйте. После долгих мучений написал код, который проверяет перед отправкой, что за файл ему хочет отправить пользователь. Скрипт в итоге должен позволять оnправлять только файлы типа .doc и .docx, а если пользователь подсовывает ему другого типа файл, скрипт выдает алерт (мол, нужен только правильный тип файла, загрузите другой), и очищает input file.

А загвоздка такая - в IE и Opera сей скрипт работает некорректно - при первом "подсовывании" левого файла скрипт срабатывает, а при втором - уже нет. В мозилле, хроме все норм работает.

Вот код:

<script language="JavaScript">
function newkrechet() {
if(username.value.substring(username.value.lastIndexOf('.')+1,username.value.length).toLowerCase()!='doc') 
 { if (username.value.substring(username.value.lastIndexOf('.')+1,username.value.length).toLowerCase()!='docx') {alert('Необходимо выбрать .doc или .docx файл для загрузки!');
clearFileInput();};};}
</script>

<script language="JavaScript">
function clearFileInput() {
  document.getElementById("fileinputplace").innerHTML='<input name="file_name[]" required="required" type="file" id="username" size="26" onChange="javascript: newkrechet();">';
}
</script>
<form>
  <span id="fileinputplace"><input type="file" required="required" name="file_name[]" id="username" size="26" onChange="javascript:if(username.value.substring(username.value.lastIndexOf('.')+1,username.value.length).toLowerCase()!='doc') 
 { if (username.value.substring(username.value.lastIndexOf('.')+1,username.value.length).toLowerCase()!='docx') {alert('Необходимо выбрать .doc или .docx файл для загрузки!');
clearFileInput();};};"></span>
</form>


Причем если убрать теги <form> </form>, то скрипт роботает во всех браузерах. Но если их оставить (а их нельзя убрать), то корректная работа будет только в мозилле и хроме....Посоветуйте, как что поправить...

dmitriymar 27.05.2012 17:14

Цитата:

Сообщение от mav1
А загвоздка такая - в IE и Opera сей скрипт работает некорректно - при первом "подсовывании" левого файла скрипт срабатывает

а при использовании сервера он и в остальных работать не будет

mav1 27.05.2012 17:21

хм, ничего не понял) при чем здесь сервер...

mav1 27.05.2012 17:22

multipart/form-data я разумеется пропишу, если что

dmitriymar 27.05.2012 17:32

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

mav1 27.05.2012 17:38

на сервере...вот собственно - http://6rx.ru/testkre3.php

Так в каком направлении копать-то...?

dmitriymar 27.05.2012 17:40

в серверной проверке расширения

mav1 27.05.2012 17:43

к сожалению, это исключено...мой код можно добить всё же? Исхитриться как-нибудь с тегом <form>?

dmitriymar 27.05.2012 17:44

mav1,
Вы фразу -политика безопасности браузеров-как себе представляете?
http://javascript.ru/forum/misc/1322...om-fajjla.html

dmitriymar 27.05.2012 18:03

а вообще используйте стандартный сброс формы reset() и не городите- document.getElementById("fileinputplace").innerHTM L='<input name="file_name[]" required="required" type="file" id="username" size="26" onChange="javascript: newkrechet();">';

mav1 27.05.2012 18:08

ох, с удовольствием бы юзал резет, но там форма большая - все поля сбросятся(

mav1 27.05.2012 18:15

c удовольствием юзал бы резет, но форма большая, полей много - все сбросится

dmitriymar 27.05.2012 18:16

name="file_name[] -зачем []?
function clearFileInput()
 {
  document.getElementById("username").value="";
 }

и в newkrechet() сделайте проверку на пустоту поля. если поле =="" алерт не выводить

mav1 27.05.2012 18:37

с предложенной вами функцией не хочет работать(

dmitriymar 27.05.2012 18:44

<form>
  <span id="fileinputplace"><input type="file" required="required" name="file_name" id="username" size="26" onChange="proverka(this)"</span>
</form>
<script>
function proverka(elem)
 {
  if (elem.value.match(/^[^\.]+\.doc(x)?$/i)) alert('true')
  else
   {
     alert("error");
     elem.value="";
    }
   
}
</script>

mav1 27.05.2012 18:48

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

dmitriymar 27.05.2012 18:53

Цитата:

Сообщение от mav1
очистка формы не производится при этом, т.е. пользователь все равно нажмет кнопку загрузить - и загрузит

в опере действительно не очищает.
ну тогда заменяйте содержимое спана. а обработчик подключайте не в innerHTML а через document.getElementById("username").onchange=фу кция
а ещё проще скрывать кнопка сабмита если расширение не то

mav1 27.05.2012 19:27

если честно, не совсем понял...ведь я и так заменял содержимое спана в своем примере? Так как теперь должен выглядеть код))

Deff 27.05.2012 19:28

mav1,
Самое простое - всовывать onclick="TestFile()" в кнопку submit

А Перед формой ставим тестирующий скрипт

<script type="text/javascript">
<!--
function TestFile()
{
//Проверка
//Если удачно
	return true;
//Если неудачно
	return false;
}
</script>


Часовой пояс GMT +3, время: 10:04.