업로드하기 전에 파일 크기 가져 오기


90

입력 파일 변경시 AJAX / PHP를 이용하여 파일을 업로드하기 전에 파일 크기를 알 수있는 방법이 있나요?




여기에 파일 이름, 유형 및 크기를 가져 오는 단계별 자습서가 있습니다. codepedia.info/…
Satinder singh

답변:


133

HTML 벨로우즈

<input type="file" id="myFile" />

다음을 시도하십시오.

//binds to onchange event of your input field
$('#myFile').bind('change', function() {

  //this.files[0].size gets the size of your file.
  alert(this.files[0].size);

});

다음 스레드를 참조하십시오.

jQuery로 파일 입력 크기를 확인하는 방법은 무엇입니까?


1
Internet Explorer (이전 버전)에 파일 배열이 존재하지 않습니까?
Tiago César Oliveira

4
예, 이것은 IE 10 이전에서 작동하지 않으며 Android 및 iOS에서 부분적으로 만 지원됩니다. caniuse.com/fileapi . 이게 쉬웠다면 ...
styks

2
결과가 바이트라고 가정합니까?
Erdal G.

4
@ErdalG. 좋은 질문! MDN이되고 누락 된 문서를, 그러나 FileList.files인 배열 등 File의 확장 객체 Glob. 그리고 사양에 따라 , Glob실제로 정의 size의 수와 특성 바이트 (빈 파일 0). 예, 결과는 bytes 입니다.
John Weisz

14
<script type="text/javascript">
function AlertFilesize(){
    if(window.ActiveXObject){
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        var filepath = document.getElementById('fileInput').value;
        var thefile = fso.getFile(filepath);
        var sizeinbytes = thefile.size;
    }else{
        var sizeinbytes = document.getElementById('fileInput').files[0].size;
    }

    var fSExt = new Array('Bytes', 'KB', 'MB', 'GB');
    fSize = sizeinbytes; i=0;while(fSize>900){fSize/=1024;i++;}

    alert((Math.round(fSize*100)/100)+' '+fSExt[i]);
}
</script>

<input id="fileInput" type="file" onchange="AlertFilesize();" />

IE 및 FF 작업


15
대답이 ActiveX를 사용하기 때문에 반대표를 던졌습니다. 2015 년에는 마이크로 소프트도 ActiveX를 버리고 있습니다. 주어진 경우 합리적인 제안 이었지만 지금과 미래에는 개발자가이를 피할 것을 권장합니다.
scott stone

3
이전 버전의 IE 만 window.ActiveXObject에 대해 true를 반환하기 때문에이 솔루션이 마음에 듭니다.
Rob Breidecker 2015-06-04

@scottstone 왜 당신이 레거시 브라우저를 지원하는 모든 답변에 반대표를 던 졌는지 이해할 수 없습니까? 이 대답은 브라우저 지문을 사용하는 것보다 훨씬 깨끗하며 누구에게도 ActiveX를 사용하도록 권장하지 않습니다.
Nicolas Bouvrette

@NicolasBouvrette-이 답변이 다른 답변보다 훨씬 깨끗하다는 데 동의하지만 지금은 반대 투표를 제거 할 수 없습니다. 원래 질문은 이전 버전의 IE와의 호환성을 요구하지 않았으며이 답변은 대부분의 코드가 5 년 이상의 IE 버전을 지원하기 위해 있다는 것을 독자들에게 조언하지 않습니다.
scott stone

@scottstone 실제로 ActiveX를 사용하지 않는 이유에 대한 내 관점에서 볼 수있는 또 하나의 확실한 점은 IE에서 끔찍한 (무서운?) 사용자 경험 인 경고 메시지를 표시하기 때문입니다.
Nicolas Bouvrette 17

13

다음은 업로드하기 전에 파일 크기를 가져 오는 간단한 예입니다. 콘텐츠가 추가되거나 변경 될 때마다 감지하기 위해 jQuery를 사용하고 있지만 files[0].sizejQuery를 사용하지 않고도 얻을 수 있습니다 .

$(document).ready(function() {
  $('#openFile').on('change', function(evt) {
    console.log(this.files[0].size);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="upload.php" enctype="multipart/form-data" method="POST" id="uploadform">
  <input id="openFile" name="img" type="file" />
</form>

다음은 파일을 FormData드래그 앤 드롭 하고 POST를 통해 서버에 업로드 하는 개념 증명 코드 입니다. 여기에는 파일 크기에 대한 간단한 검사가 포함됩니다.


8

나는 같은 문제가 있었고 정확한 해결책이 없었던 것 같습니다. 이것이 다른 사람들을 도울 수 있기를 바랍니다.

시간을내어 둘러 본 후 마침내 답을 찾았습니다. 이것은 jQuery로 파일 첨부를 얻는 코드입니다.

var attach_id = "id_of_attachment_file";
var size = $('#'+attach_id)[0].files[0].size;
alert(size);

이것은 파일 크기를 가져 오는 예제 코드입니다. 다른 작업을하려면 필요에 맞게 코드를 자유롭게 변경하십시오.


가장 인기있는 솔루션과 같이 변경 이벤트에 넣을 필요가 없기 때문에 이것을 좋아합니다. 또한 제 요구를 충족시키기 위해 코드를 변경할 수있는 권한을 주신 사실도 마음에
Matt

8

모든 브라우저에서 작동하는 최상의 솔루션;)

function GetFileSize(fileid) {
    try {
        var fileSize = 0;
        // for IE
        if(checkIE()) { //we could use this $.browser.msie but since it's deprecated, we'll use this function
            // before making an object of ActiveXObject, 
            // please make sure ActiveX is enabled in your IE browser
            var objFSO = new ActiveXObject("Scripting.FileSystemObject");
            var filePath = $("#" + fileid)[0].value;
            var objFile = objFSO.getFile(filePath);
            var fileSize = objFile.size; //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        // for FF, Safari, Opeara and Others
        else {
            fileSize = $("#" + fileid)[0].files[0].size //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        alert("Uploaded File Size is" + fileSize + "MB");
    }
    catch (e) {
        alert("Error is :" + e);
    }
}

에서 http://www.dotnet-tricks.com/Tutorial/jquery/HHLN180712-Get-file-size-before-upload-using-jquery.html

업데이트 : 이 기능을 사용하여 IE 브라우저인지 확인합니다.

function checkIE() {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)){  
        // If Internet Explorer, return version number
        alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
    } else {
        // If another browser, return 0
        alert('otherbrowser');
    }

    return false;
}

3
대답이 ActiveX를 사용하기 때문에 반대표를 던졌습니다. 2015 년에는 마이크로 소프트도 ActiveX를 버리고 있습니다. 주어진 경우 합리적인 제안 이었지만 지금과 미래에는 개발자가이를 피할 것을 권장합니다. –
scott stone

1
$ .browser는 버전 1.9의 jQuery에서 제거되었습니다 (v 1.3부터 ​​사용되지 않음).
Silvio Delgado

2
@scottstone이 뒤로 Compability가입니다 그것은 사실이 아니다 마이크로 소프트가 훨씬 많은 일에 사용하는 것입니다 여기에 증거하지 액티브 압돈 것이다 computerworld.com/article/2481188/internet/...
ucefkh

변경 우리는 IE 브라우저 (모든 버전에서 작동)에 대한 단지 작은 테스트를해야합니다 그래서 그들은 플러그인에 $ .browser를 제거 업데이트 @SilvioDelgado
ucefkh

4

$(document).ready(function() {
  $('#openFile').on('change', function(evt) {
    console.log(this.files[0].size);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="upload.php" enctype="multipart/form-data" method="POST" id="uploadform">
  <input id="openFile" name="img" type="file" />
</form>


3

HTML5를 지원하는 브라우저에는 입력 유형에 대한 파일 속성이 있습니다. 물론 이전 IE 버전에서는 작동하지 않습니다.

var inpFiles = document.getElementById('#fileID');
for (var i = 0; i < inpFiles.files.length; ++i) {
    var size = inpFiles.files.item(i).size;
    alert("File Size : " + size);
}

2

ucefkh의 솔루션이 가장 잘 작동했지만 $ .browser가 jQuery 1.91에서 더 이상 사용되지 않기 때문에 navigator.userAgent를 사용하도록 변경해야했습니다.

function IsFileSizeOk(fileid) {
    try {
        var fileSize = 0;
        //for IE
        if (navigator.userAgent.match(/msie/i)) {
            //before making an object of ActiveXObject, 
            //please make sure ActiveX is enabled in your IE browser
            var objFSO = new ActiveXObject("Scripting.FileSystemObject");
            var filePath = $("#" + fileid)[0].value;
            var objFile = objFSO.getFile(filePath);
            var fileSize = objFile.size; //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        //for FF, Safari, Opeara and Others
        else {
            fileSize = $("#" + fileid)[0].files[0].size //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        return (fileSize < 2.0);
    }
    catch (e) {
        alert("Error is :" + e);
    }
}

1

파일 크기를 얻으려면 ajax HEAD 요청을 수행해야합니다. jquery를 사용하면 다음과 같습니다.

  var req = $.ajax({
    type: "HEAD",
    url: yoururl,
    success: function () {
      alert("Size is " + request.getResponseHeader("Content-Length"));
    }
  });

그러나 그 파일 입력이 지워지면 (비어 있음) ?? u는 예를 들어 감사 할 수
DELE

1

ActiveXInternet Explorer에서 무서운 경고 메시지를 표시하고 사용자를 놀라게 할 가능성이 있으므로 사용하지 마십시오 .

ActiveX 경고

이 검사를 구현하려는 사람은 최신 브라우저에서 사용할 수 있는 FileList 개체 에만 의존하고 이전 브라우저에 대해서만 서버 측 검사에 의존해야합니다 ( 점진적 향상 ).

function getFileSize(fileInputElement){
    if (!fileInputElement.value ||
        typeof fileInputElement.files === 'undefined' ||
        typeof fileInputElement.files[0] === 'undefined' ||
        typeof fileInputElement.files[0].size !== 'number'
    ) {
        // File size is undefined.
        return undefined;
    }

    return fileInputElement.files[0].size;
}

0

PHP 파일 크기 기능을 사용할 수 있습니다. ajax를 사용하여 업로드하는 동안 파일 크기를 확인하고 값을 반환하는 php 스크립트에 ajax 요청을 요청하여 파일 크기를 먼저 확인하십시오.



0

개인적으로 HTML 표준을 고려할 때 Web World의 답변 이 오늘날 최고 라고 말하고 싶습니다 . IE <10을 지원해야하는 경우 ActiveX 형식을 사용해야합니다. Scripting.FileSystemObject에 대해 코딩하거나 ActiveX를 직접 인스턴스화하는 것과 관련된 권장 사항은 피할 것입니다.

이 경우 HTML5 API 또는 Flash / Silverlight 컨트롤을 사용하여 지원하지 않는 브라우저를 백필하도록 구성 할 수있는 plupload 와 같은 타사 JS 라이브러리를 사용하여 성공했습니다 . Plupload에는 IE <10에서 작동하는 파일 크기를 확인하기위한 클라이언트 측 API가 있습니다.

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