자바 스크립트 파일 업로드 크기 확인


답변:


327

. 일부 최신 브라우저 인 File API 에서 지원하는 W3C의 새로운 기능이 있습니다 . 이 용도로 사용할 수 있으며 지원되는지 여부를 테스트하고 필요하지 않은 경우 다른 메커니즘으로 폴백 (필요한 경우) 할 수 있습니다.

다음은 완전한 예입니다.

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Show File Data</title>
<style type='text/css'>
body {
    font-family: sans-serif;
}
</style>
<script type='text/javascript'>
function showFileSize() {
    var input, file;

    // (Can't use `typeof FileReader === "function"` because apparently
    // it comes back as "object" on some browsers. So just see if it's there
    // at all.)
    if (!window.FileReader) {
        bodyAppend("p", "The file API isn't supported on this browser yet.");
        return;
    }

    input = document.getElementById('fileinput');
    if (!input) {
        bodyAppend("p", "Um, couldn't find the fileinput element.");
    }
    else if (!input.files) {
        bodyAppend("p", "This browser doesn't seem to support the `files` property of file inputs.");
    }
    else if (!input.files[0]) {
        bodyAppend("p", "Please select a file before clicking 'Load'");
    }
    else {
        file = input.files[0];
        bodyAppend("p", "File " + file.name + " is " + file.size + " bytes in size");
    }
}

function bodyAppend(tagName, innerHTML) {
    var elm;

    elm = document.createElement(tagName);
    elm.innerHTML = innerHTML;
    document.body.appendChild(elm);
}
</script>
</head>
<body>
<form action='#' onsubmit="return false;">
<input type='file' id='fileinput'>
<input type='button' id='btnLoad' value='Load' onclick='showFileSize();'>
</form>
</body>
</html>

그리고 여기 에 작동합니다. 최신 버전의 Chrome 또는 Firefox에서 사용해보십시오.


약간의 주제를 벗어 났지만 클라이언트 측 유효성 검사는 서버 측 유효성 검사를 대체하지 않습니다 . 클라이언트 측 유효성 검사는 순전히 더 나은 사용자 경험을 제공 할 수 있도록합니다. 예를 들어, 5MB를 초과하는 파일 업로드를 허용하지 않는 경우 클라이언트 측 유효성 검사를 사용하여 사용자가 선택한 파일의 크기가 5MB를 넘지 않는지 확인하고 파일이 있으면 친절하게 메시지를 보낼 수 있습니다 (그들은 모든 시간의 업로드를 낭비하지 않도록 전용 서버에서 버려지는 결과를 얻을),하지만 당신은해야한다 또한 모든 클라이언트 측 한계 (및 기타 검증)을 회피 할 수 있기 때문에, 서버에서 그 한계를 적용합니다.


12
"모든 클라이언트 측 제한 (및 기타 유효성 검사)을 피할 수 있습니다"+1 "네이티브"/ "컴파일 된"데이터베이스 프론트 엔드 애플리케이션의 경우에도 마찬가지입니다. 그리고 데이터베이스 암호화 암호를 컴파일 된 코드에 넣지 말고 "암호화"(코드에있는 암호도 사용)-최근에 확인했습니다.
masterxilo

117

jquery 사용 :

<form action="upload" enctype="multipart/form-data" method="post">

    Upload image:
    <input id="image-file" type="file" name="file" />
    <input type="submit" value="Upload" />

    <script type="text/javascript">
        $('#image-file').bind('change', function() {
            alert('This file size is: ' + this.files[0].size/1024/1024 + "MB");
        });
    </script>

</form>

2
@ipd, IE8 대체 가능성이 있습니까? (나는 심지어 IE를 언급하기 위해 나 자신을 싫어한다)
Asher

2
이 창살은 작동하지만 여러 파일에서도 작동합니까?
Ingus

4
MiB의 기준으로 계산하는 경우 여야합니다 1024.
slartidan

69

동적 및 정적 파일 요소에서 작동

자바 스크립트 전용 솔루션

function ValidateSize(file) {
        var FileSize = file.files[0].size / 1024 / 1024; // in MB
        if (FileSize > 2) {
            alert('File size exceeds 2 MB');
           // $(file).val(''); //for clearing with Jquery
        } else {

        }
    }
 <input onchange="ValidateSize(this)" type="file">


1
좋은 답변입니다. 나는 같은 문제가 있었지만 귀하의 솔루션이 나를 위해 일했습니다 :)
Dipankar Das

1
NB OP는 게시물을 수정하여 size속성을 사용하여 코드가 올바르게 수정 되었습니다
UsAndRufus

1
대답은 거의 동일했지만 한 번의 변경으로 감사드립니다. $(obj).files[0].size/1024/1024; 그러나 다음과 같이 변경되었습니다obj.files[0].size/1024/1024;
shakir Baba

너비 및 높이 유효성 검사를 위해 이것을 확장하는 방법이 있습니까? ( "파일"을 시작점으로두고 이미지를 참조한다고 가정)
jlmontesdeoca

@jlmontesdeoca 캔버스의 도움으로 파일을 읽고 여기에서 높이와 너비를 얻을 수 있다고 생각합니다.
Arun Prasad ES

14

아니 예, 새로운 브라우저에서 파일 API를 사용하여. 자세한 내용은 TJ의 답변을 참조하십시오.

구형 브라우저도 지원해야하는 경우 SWFUpload 또는 Uploadify 와 같은 Flash 기반 업 로더를 사용해야합니다 .

SWFUpload는 데모 특징 어떻게 '쇼 file_size_limit설정이 작동합니다.

플래시가 필요하고 작동 방식은 일반 업로드 양식과 약간 다릅니다.


14

꽤 간단합니다.

            var oFile = document.getElementById("fileUpload").files[0]; // <input type="file" id="fileUpload" accept=".jpg,.png,.gif,.jpeg"/>

            if (oFile.size > 2097152) // 2 mb for bytes.
            {
                alert("File size must under 2mb!");
                return;
            }

가장 좋은 답변입니다. 달콤하고 간단한 ... :)
A. Sinha

12

jQuery Validation을 사용하는 경우 다음과 같이 작성할 수 있습니다.

$.validator.addMethod(
    "maxfilesize",
    function (value, element) {
        if (this.optional(element) || ! element.files || ! element.files[0]) {
            return true;
        } else {
            return element.files[0].size <= 1024 * 1024 * 2;
        }
    },
    'The file size can not exceed 2MB.'
);

4

나는 그런 것을 만들었습니다.

$('#image-file').on('change', function() {
 var numb = $(this)[0].files[0].size/1024/1024;
numb = numb.toFixed(2);
if(numb > 2){
alert('to big, maximum is 2MB. You file size is: ' + numb +' MB');
} else {
alert('it okey, your file has ' + numb + 'MB')
}
        });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<input type="file" id="image-file">


이것은 자바 스크립트를 말합니다, JQuery는 태그에 없습니다
Hello234

3

Mozilla Developer Network 사이트 https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications 에서 찾은 하나의 주요 Javascript 기능을 AJAX의 다른 기능과 함께 사용하고 필요에 따라 변경했습니다. 파일 크기를 쓰려는 HTML 코드의 위치와 관련된 문서 요소 ID를받습니다.

<Javascript>

function updateSize(elementId) {
    var nBytes = 0,
    oFiles = document.getElementById(elementId).files,
    nFiles = oFiles.length;

    for (var nFileId = 0; nFileId < nFiles; nFileId++) {
        nBytes += oFiles[nFileId].size;
    }
    var sOutput = nBytes + " bytes";
    // optional code for multiples approximation
    for (var aMultiples = ["K", "M", "G", "T", "P", "E", "Z", "Y"], nMultiple = 0, nApprox = nBytes / 1024; nApprox > 1; nApprox /= 1024, nMultiple++) {
        sOutput = " (" + nApprox.toFixed(3) + aMultiples[nMultiple] + ")";
    }

    return sOutput;
}
</Javascript>

<HTML>
<input type="file" id="inputFileUpload" onchange="uploadFuncWithAJAX(this.value);" size="25">
</HTML>

<Javascript with XMLHttpRequest>
document.getElementById('spanFileSizeText').innerHTML=updateSize("inputFileUpload");
</XMLHttpRequest>

건배


3

질문에 답변했지만 답변을 게시하고 싶었습니다. 향후 시청자에게 유용 할 수 있습니다. 다음 코드와 같이 사용할 수 있습니다.

<input type="file" id="fileinput" />
<script type="text/javascript">
  function readSingleFile(evt) {
    //Retrieve the first (and only!) File from the FileList object
    var f = evt.target.files[0]; 
    if (f) {
      var r = new FileReader();
      r.onload = function(e) { 
          var contents = e.target.result;
        alert( "Got the file.n" 
              +"name: " + f.name + "n"
              +"type: " + f.type + "n"
              +"size: " + f.size + " bytesn"
              + "starts with: " + contents.substr(1, contents.indexOf("n"))
        ); 
        if(f.size > 5242880) {
               alert('File size Greater then 5MB!');
                }


      }
      r.readAsText(f);
    } else { 
      alert("Failed to load file");
    }
  }

3

이 스레드에서 제공되는 JQuery 예제는 매우 구식이며 Google은 전혀 도움이되지 않았으므로 여기에 내 수정본이 있습니다.

 <script type="text/javascript">
        $('#image-file').on('change', function() {
            console.log($(this)[0].files[0].name+' file size is: ' + $(this)[0].files[0].size/1024/1024 + 'Mb');
        });
    </script>

1

fineuploader를 사용해보십시오

IE6 이상, Chrome 또는 Firefox에서 제대로 작동합니다.


3
파일 API를 지원하지 않으므로 Fine Uploader는 IE9 및 이전 버전에서 파일 크기를 확인할 수 없습니다. IE10은 파일 API를 지원하는 Internet Explorer의 첫 번째 버전입니다.
레이 니콜러스

-2

즉, '문서 모드'를 '표준'으로 설정하면 간단한 자바 스크립트 '크기'방법을 사용하여 업로드 된 파일의 크기를 얻을 수 있습니다.

즉 '문서 모드'를 '표준'으로 설정하십시오.

<meta http-equiv="X-UA-Compatible" content="IE=Edge">

'size'자바 스크립트 메소드를 사용하여 업로드 된 파일의 크기를 가져옵니다.

<script type="text/javascript">
    var uploadedFile = document.getElementById('imageUpload');
    var fileSize = uploadedFile.files[0].size;
    alert(fileSize); 
</script>

그것은 나를 위해 작동합니다.


1
어떤 메타 태그를 추가하든 IE9 이전 버전에서는 작동하지 않습니다.
레이 니콜러스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.