2013-06-12 1 views
19

파일을 읽고 FileReader 객체를 사용하여 base64로 인코딩 된 문자열로 변환하고 싶습니다.자바 스크립트에서 동 기적으로 파일 읽기

 

    var reader = new FileReader(); 
    reader.onloadend = function(evt) { 
     // file is loaded 
     result_base64 = evt.target.result; 
    }; 
    reader.readAsDataURL(file); 


그러나이 경우에, 나는 이벤트 핸들러 (onLoadEnd 이벤트)에서 변환의 결과를 얻을 : 여기 내가 사용하는 코드입니다. 나는 동기 방식을 원한다. "readAsDataURL"메서드가 'result_base64'변수의 값을 직접 반환 할 수있는 방법이 있습니까? (차단)

감사

+3

* "동기식 방법이 필요합니다."* 어떤 특별한 이유가 있습니까? 나는 그것이 가능하다고 생각하지 않는다. –

+0

파이어 폭스에는 file.getAsDataURL() 메소드가 있지만 사용되지 않으며 모든 브라우저의 유일한 동기화 버전 인 afaik입니다. – dandavis

+0

로컬 저장소 데이터베이스에 경로를 저장하고 나중에 이미지를 서버에 보내야합니다 (모든 이미지에 루프가 있으므로 동기식 메서드가 필요한 이유입니다). 로컬 저장소 제한을 초과하지 않기 위해 데이터베이스에 base64 문자열을 저장하는 것을 피하고 싶습니다 ... – Laila

답변

10

동기 작업은 일반적으로 나쁘다. 비동기 적으로 그렇게 할 실제 이유가 없으면 이벤트 콜백을 사용하는 것이 좋습니다.

파일이 손상되어 HTML5 API가 읽을 수 없다고 상상해보십시오. 결과는 알려주지 않습니다. 그것은 당신의 코드를 깨고 사이트를 차단합니다. 또는 누군가가 10GB 파일을 선택할 수 있습니다. 그러면 파일이 완전히로드 될 때까지 HTML 페이지가 고정됩니다. 비동기 이벤트 핸들러를 사용하면 가능한 오류를 잡을 수 있습니다.

var ready = false; 
var result = ''; 

var check = function() { 
    if (ready === true) { 
     // do what you want with the result variable 
     return; 
    } 
    setTimeout(check, 1000); 
} 

check(); 

var reader = new FileReader(); 
reader.onloadend = function(evt) { 
    // file is loaded 
    result = evt.target.result; 

    ready = true; 
}; 
reader.readAsDataURL(file); 

체크 기능, 검사 준비 플래그 변수가 true로 설정되어있는 경우 매 초마다 :

가 콜백 제한을 해결하려면, 나는 간단한 트릭을 사용합니다. 그렇다면 결과를 사용할 수 있는지 확인할 수 있습니다.

그렇게하는 것이 좋지 않을 수도 있지만,이 기술을 사용하여 webapp를 만들었고 동시에 실행 시간은 10 회 이상이었고 지금까지는 아무런 문제가 없었습니다.

+0

필자도 비슷한 트릭을 사용했지만 코드를 루프에 삽입하면 문제가 발생합니다. 마지막으로 콜백 메소드를 사용하여 루프가 끝나는 시점을 클로저와 결합했습니다. – Laila

+1

콜백에 매개 변수 변수를 전달하고 싶었던 것과 똑같은 문제가있었습니다. 목적은 서버에 청크 방식으로 보낼 수 있도록 파일을 청크로 분할하는 것이 었습니다. 클로저는 한 번 이해 한 위대한 일입니다. –

+0

https://stackoverflow.com/a/46832928/851951이 방법은 좋지만 비동기 적으로 작동합니다. – Dani

-3

비즈니스가 늦어 지지만 누군가에게 도움이 될 수 있습니다. 우리는 단순히 방 밖으로 싸우는 것만으로도 충분합니다.

var file = $('#myfile')[0].files[0]; 

var reader = new FileReader(); 
reader.onload = function(progressEvent) { 
     //console.log(this.result); 
     handle(this.result); 
}; 
reader.readAsText(file); 

function handle(temp_lines) { 
    var inputLines=new Array(); 
    var lines = temp_lines.split('\n'); 

    for(var line = 0; line < lines.length; line++) { 
     console.log(lines[line]); 
     inputLines[line]=lines[line]; 
    } 
} 
+4

이것이 어떻게 동기인지는 분명하지 않습니다. – Nathan

+0

그렇지 않습니다. 비동기적인 방법입니다. – trinalbadger587

0
Node.js를, child_process에서 사용 execSync에서

와 쉘이 동 기적으로 당신을 위해 그것을 읽을 수 있습니다. 이 하위 프로세스의 출력을 상위로 리디렉션합니다.

// Don't forget to use your favorite encoding in toString() 
var execSync = require('child_process').execSync; 
var fileContents = execSync('cat path/to/file.txt', {stdio: "pipe"}).toString(); 

나는 UUOC 상 후보로 기꺼이 받아 들일 것입니다. ;)