2013-12-20 1 views
4

javascript FileReader API를 사용하여 파일 입력 필드에서 제공되는 이미지의 미리보기를 표시 할 수 있습니다. 이것은 이미지를 표시하기 위해 서버 측 PHP와 Ajax를 사용할 필요가 없다는 점에서 매우 유용합니다.javascript FileReader API를 사용할 때 파일 크기 제한이 있습니까?

사용되는 이미지 파일의 크기에 대한 제한이 :

내 질문은 생각이 무엇입니까? 사용자가 20MB의 이미지를 선택하는 것처럼, filereader가 이미지를 처리 ​​할 수 ​​있습니까? 그리고 머신 메모리가 잠재적으로 최대가 될 것입니까?

현재 컴퓨터에서 로컬로 테스트하고 있습니다. 나는 bmp 파일을로드하려고 시도했다. (53MB!) 페이지에서 처리하고 표시하는 데 약 15 초가 걸렸다. 1/2MB의 다른 파일은 일반적으로 즉시 표시됩니다. 파일 크기에 제한이 없습니다 나타납니다

<!DOCTYPE html> 
<html> 

    <head> 
     <meta charset="utf-8"/> 
     <title>Dropzone File Upload</title> 

    </head> 

    <body> 

     <img id="uploadPreview" src="default.png" style="width: 100px; height: 100px;" /> 
     <input id="uploadImage" type="file" name="myPhoto" onchange="PreviewImage();" /> 
     <p id="uploadProgress">&nbsp;</p> 

     <script type="text/javascript"> 
      function PreviewImage() { 
       var avatar_image = document.getElementById("uploadImage"); 
       var avatar_preview = document.getElementById("uploadPreview"); 
       var avatar_progress = document.getElementById("uploadProgress"); 

       if (window.FileReader) { //if supports filereader 

        var imgReader = new FileReader(); 
        imgReader.readAsDataURL(avatar_image.files[0]); //read from file input 

        imgReader.onloadstart = function(e) { 
         avatar_progress.innerHTML = "Starting to Load"; 
        } 
        imgReader.onload = function (imgReaderEvent) { 
         //if file is image 
         if (
          avatar_image.files[0].type == 'image/jpg' || 
          avatar_image.files[0].type == 'image/jpeg' || 
          avatar_image.files[0].type == 'image/png' || 
          avatar_image.files[0].type == 'image/gif' || 
          avatar_image.files[0].type == 'image/bmp' 
          ) { 
          avatar_preview.src = imgReaderEvent.target.result; 
         } 
         else { 
          avatar_preview.src = 'filetype.png'; 
         } 
        } 
        imgReader.onloadend = function(e) { 
         avatar_progress.innerHTML = "Loaded!"; 
        } 
       } 

       /* For no support, use ActiveX instead */ 
       else { 
        document.getElementById("uploadPreview").src = "nosupport.png"; 
       }  

      }; 
     </script> 

    </body> 
</html> 
+1

[이 답변] (http://stackoverflow.com/questions/9265139/html5-filereader-api-crashes-chrome-17-when-reading-large-file-as-slice) 메모리가 기본임을 제안합니다. 한정. – kamituel

+0

이와 같은 용량 문제는 항상 동일한 대답을 가지고 있습니다. 그렇지 않을 때까지 작동하고 클라이언트 기능에 따라 다릅니다. 값싼 스마트 폰은 RAM이 많은 데스크톱 컴퓨터만큼 용량이 없습니다. – Pointy

답변

-1

: (참고 :이 코드가 지원되는 브라우저에서 잘 작동)

그것은 아마 여기에 필요하지만 아니에요 내 HTML 파일입니다. 나는 과거에 당신과 똑같은 일을했고, 그 시간이 램/브라우저의 저장 장치 때문인 것으로 나타났습니다. 따라서 지연은 사용자의 컴퓨터에 따라 다릅니다. 많은 큰 이미지 (> 10MB)를 처리해야하는 경우로드하는 동안 gif 로더를 넣을 수 있습니다.

+0

gif loader는 좋은 생각입니다. 일반적으로 낮은 범위에서 파일 크기를 예상하지만, 파일 크기 제한보다 큰 파일 크기를 가진 사례를 지원할 수 있기를 바랍니다. #uploadPreview와 같은 큰 파일을 처리하는 데 문제가 있습니까? 아니면 관련이 없습니까? –

+1

#upload 미리보기에서는 문제가되지 않습니다. 그러나 이미지의 해상도가 높고 (예 : 2000x2000) #uploadPreview가 작은 상자 (예 : 100x100)이면 이미지의 크기가 줄어들고 이미지에 별명이 있음을 기억하십시오. – ClemSndr

+0

이것은 올바르지 않습니다. 정답은 하드 한도입니다. – rjurney

8

Chrome 45에서 제한 사항은 261MB입니다.

크기가 제한을 초과하면 불행히도 오류 (FileReader.error == null)가 발생하지 않으며 결과는 빈 문자열입니다.

+0

방금 ​​큰 데이터 세트로이 사실을 알았습니다. 257MB 파일이 읽히지 만 459MB 파일은 빈 문자열을 반환합니다. Chrome 49. – o1sound

+1

@AndreKR Google의 공식 문서 인 Google에서 제한 사항이 있습니까? –

+0

@PaulAlexander 아무 것도 찾을 수 없습니다. 나는 그 수가 2^28 또는 2^29 또는 그와 비슷한 최대 Javascript 문자열 길이의 야간에 있다는 것을 알아 차렸다. – AndreKR