파일 업로드 전 파일 확장자 확인


91

서블릿에 이미지를 업로드하고 있습니다. 업로드 된 파일이 이미지인지 여부는 파일 헤더의 매직 넘버를 확인하여 서버 측에서만 확인합니다. 서블릿에 양식을 제출하기 전에 클라이언트 측에서 확장을 검증하는 방법이 있습니까? Enter 키를 누르면 업로드가 시작됩니다.

클라이언트 측에서 Javascript와 jQuery를 사용하고 있습니다.

업데이트 : 마침내 바이트를 읽고 이미지가 아닌 경우 업로드를 거부하는 서버 측 유효성 검사로 끝났습니다.


2
이전 질문 중 하나에서 제안한대로 Uploadify를 사용하고 계십니까?
BalusC 2010

아니요, 50-96 사이에서 멈 춥니 다. 다양한 입력으로 여러 번 시도했습니다. 그리고 그 당시 나도 해결책을 찾기 위해 서두르고있었습니다. 그래서 저는 간단한 시도를했습니다 jquery.ProgressBar.js. 잘 작동합니다. ### 그래서, uploadify로 확인할 수 있습니까 !!!


사용자가 지정된 형식의 파일을 선택하는지 확인하기 위해 단순히 입력 태그에 accept 속성을 사용할 수는 없습니까?
AnonSar

답변:


118

파일 확장자 만 확인할 수 있지만 사용자는 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 />

잘못된 파일 확장자의 경우 경고를 표시하고 입력을 재설정합니다.


"onChange"대신 "onSubmit"을 사용하는 것이 번거 롭다는 점을 추가하고 싶습니다. 특히 "multiple"옵션을 사용하는 경우 더욱 그렇습니다. 전체 양식이 게시 될 때가 아니라 선택한대로 각 파일을 확인해야합니다.
DevlshOne 2015

@DevlshOne 흥미로운 아이디어는 게시물에서도 이것을 언급 할 것입니다. 감사!
그림자 마법사가 당신을 위해 귀입니다

이 코드 @Shadow Wizard에 감사드립니다. 정말 많은 도움이되었습니다!
Anahit Ghazaryan 2015

1
@garryman은 어떻게 실패합니까? 여기에있는 질문은 파일이 필요하다는 것을 언급하지 않습니다. 귀하의 경우 파일이 필수 필드 인 경우 var blnValid = false;arrInputs를 통해 루프 위로 줄 을 이동 한 다음 루프 후에 blnValid 변수를 확인합니다. 참이면 양식을 제출하고 그렇지 않으면 파일이 필요하다는 경고를 표시합니다.
Shadow Wizard is Ear For You

내 아래 답변을 확인하십시오
Divyesh Jani

73

기존 답변 중 어느 것도 요청의 단순성을 위해 충분히 간결 해 보이지 않았습니다. 주어진 파일 입력 필드에 세트의 확장자가 있는지 확인하는 것은 다음과 같이 수행 할 수 있습니다.

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);
Tedd 한센에게

2
읽기가 조금 어렵지만 , "i"정규식 문자열 ( )$')의 끝에 추가하는 것을 의미 합니다. 이 파일 확장명의 모든 케이스에 대한 지원을 추가합니다 (.JPG, .JPG, .JPG, 등 ...)
Tedd 한센

고맙습니다, Tedd, 대소 문자를 구분하지 않는 매칭을하는 것이 낫습니다.
Orbling

39
$(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 2010 년

취소를 누르면 경고가 발생합니다.
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
Roberto

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/*"대부분의 경우 확실히 가장 현명한 선택입니다.
Alberto T.

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입력 파일 유형에 사용할 수 있는 속성을 사용할 수 있습니다. Checkout MDN 문서


2
이것으로 당신은 여전히 다른 파일 형식을 선택할 수 있습니다
세자르 레온에게

@ CésarLeón 네. 사용자는 모든 파일을 선택할 수 있습니다. 이를 제한하려면 수동 유효성 검사를 수행해야합니다. 다른 답변을 확인하십시오.
Madura Pradeep 19

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 2013

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

필요한 파일 유형을 포함하는 배열을 만들고 jQuery에서 $ .inArray ()를 사용하여 파일 유형이 배열에 존재하는지 확인할 수 있습니다.

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

0

확장을 확인하는 것보다 mimetype으로 시도하는 것이 좋습니다. 왜냐하면 때로는 파일이 없어도 존재할 수 있으며 Linux 및 Unix 시스템에서 매우 잘 작동하기 때문입니다.

따라서 다음과 같이 시도 할 수 있습니다.

["image/jpeg", "image/png", "image/gif"].indexOf(file.type) > -1

-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")).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.