Проверка расширения файла перед загрузкой файла - PullRequest
74 голосов
/ 20 ноября 2010

Я загружаю изображения в сервлет.Проверка того, является ли загруженный файл изображением, выполняется только на стороне сервера, проверяя магические числа в заголовке файла.Есть ли способ проверить расширения на стороне клиента перед отправкой формы сервлету?Как только я нажимаю Enter, начинается загрузка.

Я использую Javascript и jQuery на стороне клиента.

Обновление: Я наконец-то получил проверку на стороне сервера, которая читает байты и отклоняет загрузку, если это не таккартинка.

Ответы [ 17 ]

104 голосов
/ 21 ноября 2010

Можно проверить только расширение файла, но пользователь может легко переименовать virus.exe в virus.jpg и «пройти» проверку.

Для чего стоит, вот код для проверки расширения файлаи прервать, если не встречается одно из допустимых расширений: (выберите неверный файл и попробуйте отправить, чтобы увидеть предупреждение в действии)

var _validFileExtensions = [".jpg", ".jpeg", ".bmp", ".gif", ".png"];    
function Validate(oForm) {
    var arrInputs = oForm.getElementsByTagName("input");
    for (var i = 0; i < arrInputs.length; i++) {
        var oInput = arrInputs[i];
        if (oInput.type == "file") {
            var sFileName = oInput.value;
            if (sFileName.length > 0) {
                var blnValid = false;
                for (var j = 0; j < _validFileExtensions.length; j++) {
                    var sCurExtension = _validFileExtensions[j];
                    if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) {
                        blnValid = true;
                        break;
                    }
                }
                
                if (!blnValid) {
                    alert("Sorry, " + sFileName + " is invalid, allowed extensions are: " + _validFileExtensions.join(", "));
                    return false;
                }
            }
        }
    }
  
    return true;
}
<form onsubmit="return Validate(this);">
  File: <input type="file" name="my file" /><br />
  <input type="submit" value="Submit" />
</form>

Обратите внимание, что код позволит пользователю отправлять без выбора файла ... если это необходимо, удалите строку if (sFileName.length > 0) { и связанную с ней закрывающую скобку.Код проверяет любой файл, введенный в форму, независимо от его имени.

Это можно сделать с помощью jQuery в несколько строк, но я достаточно удобен с «сырым» JavaScript, и окончательный результат тот же.

Если у вас есть больше файлов или вы хотите запустить проверку при изменении файла, а не только при отправке формы, используйте вместо этого такой код:

var _validFileExtensions = [".jpg", ".jpeg", ".bmp", ".gif", ".png"];    
function ValidateSingleInput(oInput) {
    if (oInput.type == "file") {
        var sFileName = oInput.value;
         if (sFileName.length > 0) {
            var blnValid = false;
            for (var j = 0; j < _validFileExtensions.length; j++) {
                var sCurExtension = _validFileExtensions[j];
                if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) {
                    blnValid = true;
                    break;
                }
            }
             
            if (!blnValid) {
                alert("Sorry, " + sFileName + " is invalid, allowed extensions are: " + _validFileExtensions.join(", "));
                oInput.value = "";
                return false;
            }
        }
    }
    return true;
}
File 1: <input type="file" name="file1" onchange="ValidateSingleInput(this);" /><br />
File 2: <input type="file" name="file2" onchange="ValidateSingleInput(this);" /><br />
File 3: <input type="file" name="file3" onchange="ValidateSingleInput(this);" /><br />

Это отобразит предупреждение и сбросит ввод в случае неверного расширения файла.

63 голосов
/ 28 июня 2013

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

function hasExtension(inputID, exts) {
    var fileName = document.getElementById(inputID).value;
    return (new RegExp('(' + exts.join('|').replace(/\./g, '\\.') + ')$')).test(fileName);
}

Таким образом, пример использования может быть (где upload - это id для ввода файла):

if (!hasExtension('upload', ['.jpg', '.gif', '.png']) {
    // ... block upload
}

Или как плагин jQuery:

$.fn.hasExtension = function(exts) {
    return (new RegExp('(' + exts.join('|').replace(/\./g, '\\.') + ')$')).test($(this).val());
}

Пример использования:

if (!$('#upload').hasExtension(['.jpg', '.png', '.gif'])) {
    // ... block upload
}

.replace(/\./g, '\\.') предназначен для экранирования точки для регулярного выражения, так чтобазовые расширения могут быть переданы без точек, совпадающих с каким-либо символом.

На них нет проверки ошибок, чтобы они были короткими, предположительно, если вы их используете, вы убедитесь, что ввод существует первым, а массив расширений действителен!

26 голосов
/ 18 марта 2015
$(function () {
    $('input[type=file]').change(function () {
        var val = $(this).val().toLowerCase(),
            regex = new RegExp("(.*?)\.(docx|doc|pdf|xml|bmp|ppt|xls)$");

        if (!(regex.test(val))) {
            $(this).val('');
            alert('Please select correct file format');
        }
    });
});
15 голосов
/ 23 ноября 2016

Я пришел сюда, потому что был уверен, что ни один из ответов здесь не был вполне ... поэтическим:

function checkextension() {
  var file = document.querySelector("#fUpload");
  if ( /\.(jpe?g|png|gif)$/i.test(file.files[0].name) === false ) { alert("not an image!"); }
}
<input type="file" id="fUpload" onchange="checkextension()"/>
9 голосов
/ 21 мая 2013

проверьте, выбран файл или нет

       if (document.myform.elements["filefield"].value == "")
          {
             alert("You forgot to attach file!");
             document.myform.elements["filefield"].focus();
             return false;  
         }

проверьте расширение файла

  var res_field = document.myform.elements["filefield"].value;   
  var extension = res_field.substr(res_field.lastIndexOf('.') + 1).toLowerCase();
  var allowedExtensions = ['doc', 'docx', 'txt', 'pdf', 'rtf'];
  if (res_field.length > 0)
     {
          if (allowedExtensions.indexOf(extension) === -1) 
             {
               alert('Invalid file Format. Only ' + allowedExtensions.join(', ') + ' are allowed.');
               return false;
             }
    }
7 голосов
/ 30 сентября 2012

Мне нравится этот пример:

<asp:FileUpload ID="fpImages" runat="server" title="maximum file size 1 MB or less" onChange="return validateFileExtension(this)" />

<script language="javascript" type="text/javascript">
    function ValidateFileUpload(Source, args) {
        var fuData = document.getElementById('<%= fpImages.ClientID %>');
        var FileUploadPath = fuData.value;

        if (FileUploadPath == '') {
            // There is no file selected 
            args.IsValid = false;
        }
        else {
            var Extension = FileUploadPath.substring(FileUploadPath.lastIndexOf('.') + 1).toLowerCase();
            if (Extension == "gif" || Extension == "png" || Extension == "bmp" || Extension == "jpeg") {
                args.IsValid = true; // Valid file type
                FileUploadPath == '';
            }
            else {
                args.IsValid = false; // Not valid file type
            }
        }
    }
</script>
5 голосов
/ 30 июня 2014

Если вам нужно протестировать удаленные URL-адреса в поле ввода, вы можете попробовать протестировать простое регулярное выражение с интересующими вас типами.

$input_field = $('.js-input-field-class');

if ( !(/\.(gif|jpg|jpeg|tiff|png)$/i).test( $input_field.val() )) {
  $('.error-message').text('This URL is not a valid image type. Please use a url with the known image types gif, jpg, jpeg, tiff or png.');
  return false;
}

Это будет захватывать что угодно окончание в .gif, .jpg, .jpeg, .tiff или .png

Следует отметить, что некоторые популярные сайты, такие как Twitter, добавляют атрибут размера к концу своих изображений.Например, следующее не сможет выполнить этот тест, даже если это допустимый тип изображения:

https://pbs.twimg.com/media/BrTuXT5CUAAtkZM.jpg:large

Из-за этого это не идеальное решение.Но это поможет вам пройти 90% пути.

3 голосов
/ 25 марта 2017

попробуйте это (работает для меня)

  
  function validate(){
  var file= form.file.value;
       var reg = /(.*?)\.(jpg|bmp|jpeg|png)$/;
       if(!file.match(reg))
       {
    	   alert("Invalid File");
    	   return false;
       }
       }
<form name="form">
<input type="file" name="file"/>
<input type="submit" onClick="return validate();"/>
</form>

     
3 голосов
/ 07 сентября 2018

Используете ли вы input type = "file", чтобы выбрать загружаемые файлы? если так, то почему бы не использовать атрибут accept?

<input type="file" name="myImage" accept="image/x-png,image/gif,image/jpeg" />
1 голос
/ 06 мая 2017

Вы можете использовать атрибут accept, доступный для типов входных файлов. Оформить заказ MDN документация

...