Подтвердить что ты не робот

Фильтровать расширения в загрузке HTML-формы

У меня есть простая форма отправки HTML, и я хочу указать расширение по умолчанию (например, "*.drp" ). Я читал, что способ сделать это через атрибут ACCEPT входного тега, но я не знаю, как именно.

<form enctype="multipart/form-data" action="uploader.php" method="POST">
Upload DRP File:
<input name="Upload Saved Replay" type="file" accept="*.drp"/><br />
<input type="submit" value="Upload File" />
</form>

Edit Я знаю, что проверка возможна с помощью javascript, но я хотел бы, чтобы пользователь видел только файлы ".drp" в своем всплывающем диалоговом окне. Кроме того, мне все равно, что проверка на стороне сервера в этом приложении.

4b9b3361

Ответ 1

Для определенных форматов, таких как ваш .drp. Вы можете напрямую передать это в accept = ". Drp", это сработает для этого.

Но без "*"

<input name="Upload Saved Replay" type="file" accept=".drp" />
<br/>

Ответ 2

Я использую javascript для проверки расширения файла. Вот мой код:

HTML

<input name="fileToUpload" type="file" onchange="check_file()" >

.. ..

Javascript

function check_file(){
                str=document.getElementById('fileToUpload').value.toUpperCase();
        suffix=".JPG";
        suffix2=".JPEG";
        if(str.indexOf(suffix, str.length - suffix.length) == -1||
                       str.indexOf(suffix2, str.length - suffix2.length) == -1){
        alert('File type not allowed,\nAllowed file: *.jpg,*.jpeg');
            document.getElementById('fileToUpload').value='';
        }
    }

Ответ 3

Атрибут accept ожидает типы MIME, а не маски файлов. Например, чтобы принимать изображения PNG, вам необходимо принять = "image/png". Возможно, вам придется выяснить, какой тип MIME используется браузером для вашего типа файла, и использовать его соответствующим образом. Однако, поскольку файл "drp" не отображается стандартным, вы могли бы принимать общий тип MIME.

Кроме того, похоже, что большинство браузеров не могут соблюдать этот атрибут.

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

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

Ответ 4

Вы можете сделать это с помощью javascript. Возьмите значение поля формы в вашей функции отправки, проанализируйте расширение.

Вы можете начать с чего-то вроде этого:

<form name="someform"enctype="multipart/form-data" action="uploader.php" method="POST">
<input type=file name="file1" />
<input type=button onclick="val()" value="xxxx" />
</form>
<script>
function val() {
    alert(document.someform.file1.value)
}
</script>

Я согласен с alexmac - сделайте это и на стороне сервера.

Ответ 5

Я бы не использовал этот атрибут, поскольку большинство браузеров игнорируют его, как указывает CMS.

В любом случае, используйте проверку на стороне клиента, но только в сочетании со стороной сервера. Любая проверка на стороне клиента может быть получена.

Немного от темы, но некоторые люди проверяют тип содержимого для проверки загруженного файла. Вы должны быть осторожны в этом, так как злоумышленник может легко изменить его и загрузить, например, файл php. См. Пример: http://www.scanit.be/uploads/php-file-upload.pdf

Ответ 6

Атрибут accept указывает список типов содержимого (MIME-типы), разделенный запятыми, который будет обрабатывать целевой объект формы. К сожалению, этот атрибут игнорируется всеми основными браузерами, поэтому он никак не влияет на диалог файла браузера.

Ответ 7

Другое решение с несколькими строками

function checkFile(i){
  i = i.substr(i.length - 4, i.length).toLowerCase();
  i = i.replace('.','');
  switch(i){
    case 'jpg':
    case 'jpeg':
    case 'png':
    case 'gif':
      // do OK stuff
      break;
    default:
      // do error stuff
      break;
  }
}