Перевірка розширення файлу перед завантаженням файлу


90

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

Я використовую Javascript і jQuery на стороні клієнта.

Оновлення: нарешті, я отримав перевірку на стороні сервера, яка читає байти та відхиляє завантаження, якщо це не зображення.


2
Ви використовуєте Uploadify, як було запропоновано в одному з попередніх питань, чи не так?
BalusC

Ні, це зупиняється між 50-96. Багато разів пробував з різними входами. І я тоді теж поспішав із рішенням. Отже, я спробував просто jquery.ProgressBar.js. Це працює, чудово. ### Отже, чи можу я перевірити за допомогою uploadify !!!


Чи не можемо ми просто використовувати атрибут accept у вхідному тегу, щоб переконатися, що користувач вибирає файл вказаного формату?
AnonSar

Відповіді:


117

Можна перевірити лише розширення файлу, але користувач може легко перейменувати 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 />

Це покаже попередження та скине вхідні дані у випадку недійсного розширення файлу.


Я просто хотів би додати, що використання "onSubmit" замість "onChange" є громіздким, особливо якщо використовується параметр "multiple". Кожен файл слід перевіряти так, як він вибраний, а не тоді, коли розміщена вся форма.
Devlsh,

@DevlshОдна цікава ідея, згадаю про це також у дописі. Дякую!
Майстер тіней - вухо для вас

Щиро дякую за цей код @Shadow Wizard, це мені дуже допомогло!
Анахіт Газарян

1
@garryman не вдається як? Тут не йдеться про необхідність файлу. Якщо у вашому випадку файл є обов’язковим для заповнення полем, ви можете перемістити рядок var blnValid = false;вище циклу через arrInputs, а потім після циклу перевірте змінну blnValid: якщо істина, нехай форма подається, інакше відображається попередження про необхідність файлу.
Майстер тіней - вухо для вас

перевірте мою відповідь нижче
Divyesh Jani

72

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

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, '\\.')Є , щоб уникнути точок для регулярного виразу , так що основні розширення можуть бути передані в системі без точок , відповідних будь-якого символ.

Немає помилок при їх перевірці, щоб вони були короткими, імовірно, якщо ви їх використовуєте, ви переконаєтесь, що спочатку введення існує, а масив розширень дійсний!


10
Приємно. Зверніть увагу, що ці сценарії чутливі до регістру. Для вирішення цього вам потрібно датиRexExp the "i" modifier, for example: return (new RegExp('(' + exts.join('|').replace(/\./g, '\\.') + ')$', "i")).test(fileName);
Тедд Хансен

2
Трохи важко читати, але це означає додавання , "i"після закінчення рядка регулярних виразів ( )$'). Це додасть підтримку будь-якого кожуха у розширенні імені файлу (.jpg, .JPG, .Jpg тощо ...)
Тедд Хансен,

Дякую, Тедде, було б краще мати відповідність без урахування регістру.
Орблінг

38
$(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');
        }
    });
});

1
Дякую, дуже просто і чисто.
Th3_hide

якщо натиснути кнопку скасувати, це викличе попередження.
PinoyStackOverflower

18

Я прийшов сюди, бо був впевнений, що жодна з відповідей тут не була зовсім ... поетичною:

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()"/>


Спасибі, це працює в Angular з невеликими змінами, дякую
skydev

добре працював для мене, хоча перед тестуванням слід обрізати всі кінцеві пробіли від імені. +1
Роберто

9

перевірте, якщо файл вибрано чи ні

       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;
             }
    }

8

Мені подобається цей приклад:

<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>

7

Чи використовуєте ви тип введення = "файл" для вибору файлів для завантаження? якщо так, чому б не використовувати атрибут accept?

<input type="file" name="myImage" accept="image/x-png,image/gif,image/jpeg" />

Це! accept="image/*"це, безумовно, найрозумніший вибір у більшості випадків.
Альберто Т.

6

Якщо вам потрібно протестувати віддалені 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% шляху.


4

спробуйте це (працює для мене)

  
  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>

     


2

Інший сьогоднішній приклад через Array.prototype.some () .

function isImage(icon) {
  const ext = ['.jpg', '.jpeg', '.bmp', '.gif', '.png', '.svg'];
  return ext.some(el => icon.endsWith(el));
}

console.log(isImage('questions_4234589.png'));
console.log(isImage('questions_4234589.doc'));


1

Ось спосіб багаторазового використання, якщо ви використовуєте jQuery

Функція бібліотеки (не вимагає jQuery):

function stringEndsWithValidExtension(stringToCheck, acceptableExtensionsArray, required) {
    if (required == false && stringToCheck.length == 0) { return true; }
    for (var i = 0; i < acceptableExtensionsArray.length; i++) {
        if (stringToCheck.toLowerCase().endsWith(acceptableExtensionsArray[i].toLowerCase())) { return true; }
    }
    return false;
}


String.prototype.startsWith = function (str) { return (this.match("^" + str) == str) }

String.prototype.endsWith = function (str) { return (this.match(str + "$") == str) }

Функція сторінки (вимагає jQuery (ледве)):

$("[id*='btnSaveForm']").click(function () {
    if (!stringEndsWithValidExtension($("[id*='fileUploader']").val(), [".png", ".jpeg", ".jpg", ".bmp"], false)) {
        alert("Photo only allows file types of PNG, JPG and BMP.");
        return false;
    }
    return true;
});

1

[TypeScript]

uploadFileAcceptFormats: string[] = ['image/jpeg', 'image/gif', 'image/png', 'image/svg+xml'];

// if you find the element type in the allowed types array, then read the file
isAccepted = this.uploadFileAcceptFormats.find(val => {
    return val === uploadedFileType;
});

1

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


2
За допомогою цього ви все ще можете вибрати інші типи файлів
César León

@ CésarLeón Так. Користувач має можливість вибрати всі файли. Якщо ви також хочете обмежити це, вам потрібно зробити перевірку вручну. Перевірте інші відповіді.
Мадура Прадіп

1

Ось як це робиться в jquery

$("#artifact_form").submit(function(){
    return ["jpg", "jpeg", "bmp", "gif", "png"].includes(/[^.]+$/.exec($("#artifact_file_name").val())[0])
  });

1

Коли ви хочете перевірити кнопку перегляду та розширення файлу, використовуйте цей код:

function fileValidate(){ 
var docVal=document.forms[0].fileUploaded.value;
var extension = docVal.substring(docVal.lastIndexOf(".")+1,docVal.length);
if(extension.toLowerCase() != 'pdf')
alert("Please enter file  in .pdf extension ");

return false;
}

1
коли ви хочете перевірити кнопку перегляду та розширення файлу, використовуйте цей код.
Аджай Кумар Гупта,

0
<script type="text/javascript">

        function file_upload() {
            var imgpath = document.getElementById("<%=FileUpload1.ClientID %>").value;
            if (imgpath == "") {
                alert("Upload your Photo...");
                document.file.word.focus();
                return false;
            }
            else {
                // code to get File Extension..

                var arr1 = new Array;
                arr1 = imgpath.split("\\");
                var len = arr1.length;
                var img1 = arr1[len - 1];
                var filext = img1.substring(img1.lastIndexOf(".") + 1);
                // Checking Extension
                if (filext == "bmp" || filext == "gif" || filext == "png" || filext == "jpg" || filext == "jpeg" ) {
                    alert("Successfully Uploaded...")
                    return false;
                }
                else {
                    alert("Upload Photo with Extension ' bmp , gif, png , jpg , jpeg '");
                    document.form.word.focus();
                    return false;
                }
            }
        }

        function Doc_upload() {
            var imgpath = document.getElementById("<%=FileUpload2.ClientID %>").value;
            if (imgpath == "") {
                alert("Upload Agreement...");
                document.file.word.focus();
                return false;
            }
            else {
                // code to get File Extension..

                var arr1 = new Array;
                arr1 = imgpath.split("\\");
                var len = arr1.length;
                var img1 = arr1[len - 1];
                var filext = img1.substring(img1.lastIndexOf(".") + 1);
                // Checking Extension
                if (filext == "txt" || filext == "pdf" || filext == "doc") {
                    alert("Successfully Uploaded...")
                    return false;
                }
                else {
                    alert("Upload File with Extension ' txt , pdf , doc '");
                    document.form.word.focus();
                    return false;
                }
            }
        }
</script>

3
Було б краще, якщо б ви написали короткий опис своєї відповіді.
Roopendra

0

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 />


0

Ви можете створити масив, що включає необхідний тип файлу, і використовувати $ .inArray () у jQuery, щоб перевірити, чи існує тип файлу в масиві.

var imageType = ['jpeg', 'jpg', 'png', 'gif', 'bmp'];  

// Given that file is a file object and file.type is string 
// like "image/jpeg", "image/png", or "image/gif" and so on...

if (-1 == $.inArray(file.type.split('/')[1], imageType)) {
  console.log('Not an image type');
}

0

ми можемо перевірити це при поданні або ми можемо змінити подію цього контролю

var fileInput = document.getElementById('file');
    var filePath = fileInput.value;
    var allowedExtensions = /(\.jpeg|\.JPEG|\.gif|\.GIF|\.png|\.PNG)$/;
    if (filePath != "" && !allowedExtensions.exec(filePath)) {
    alert('Invalid file extention pleasse select another file');
    fileInput.value = '';
    return false;
    }

-1

На мою думку, це найкраще рішення, яке набагато коротше, ніж інші:

function OnSelect(e) {
    var acceptedFiles = [".jpg", ".jpeg", ".png", ".gif"];
    var isAcceptedImageFormat = ($.inArray(e.files[0].extension, acceptedFiles)) != -1;

    if (!isAcceptedImageFormat) {
        $('#warningMessage').show();
    }
    else {
        $('#warningMessage').hide();
    }
}

У цьому випадку функція викликається з елемента керування Kendo Upload з таким налаштуванням:

.Events(e => e.Select("OnSelect")).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.