다양한 브라우저에서 javascript로 클라이언트 측 파일 내용 읽기


113

브라우저를 통해 클라이언트 컴퓨터의 파일 내용을 읽을 수있는 스크립트 전용 솔루션을 제공하려고합니다.

Firefox 및 Internet Explorer에서 작동하는 솔루션이 있습니다. 예쁘지는 않지만 지금은 시도하고 있습니다.

function getFileContents() {
    var fileForUpload = document.forms[0].fileForUpload;
    var fileName = fileForUpload.value;

    if (fileForUpload.files) {
        var fileContents = fileForUpload.files.item(0).getAsBinary();
        document.forms[0].fileContents.innerHTML = fileContents;
    } else {
        // try the IE method
        var fileContents = ieReadFile(fileName);
        document.forms[0].fileContents.innerHTML = fileContents;
    }
}       

function ieReadFile(filename) 
{
    try
    {
        var fso  = new ActiveXObject("Scripting.FileSystemObject"); 
        var fh = fso.OpenTextFile(filename, 1); 
        var contents = fh.ReadAll(); 
        fh.Close();
        return contents;
    }
    catch (Exception)
    {
        return "Cannot open file :(";
    }
}

전화를 걸어 getFileContents()내용을 fileContents텍스트 영역에 씁니다 .

다른 브라우저에서이 작업을 수행하는 방법이 있습니까?

나는 현재 Safari와 Chrome에 가장 관심이 많지만 다른 브라우저에 대한 제안에 열려 있습니다.

편집 : "왜 이렇게 하시겠습니까?"라는 질문에 대한 응답 :

기본적으로 클라이언트 측에서 일회성 암호와 함께 파일 내용을 해시하여이 정보를 확인으로 다시 보낼 수 있습니다.


대답이 아니라 명확성을 위해 파일의 위치를 ​​알아야합니까? 그렇지 않은 경우 파일의 위치를 ​​파일 입력에서 읽어야합니까? 아니면 텍스트 상자 / 텍스트 영역 / 무엇이든 될 수 있습니까?
— Darko Z

좋은 질문. 아니요, 파일의 출처는별로 신경 쓰지 않고 내용 만 신경 씁니다. 파일 입력을 사용하는 것이 기본 HTML이기 때문에 나에게 합리적으로 보입니다.해야 할 일이 하나 적습니다.
— Damovisa 2009

왜이 일을 하시겠습니까? 서버는 그렇게하기위한 것입니다.
— geowa4

간단히 말해서 사용자가 암호를 입력하고 파일을 선택합니다. 암호는 파일 내용과 함께 해시되고 파일과 함께 서버로 전송됩니다. 거기에 도착하면 올바른 클라이언트 암호가 사용되었는지 확인할 수 있습니다.
— Damovisa 2009

답변:


159

파일 API에 대한 정보를 추가하도록 편집 됨

이 답변을 처음 작성했기 때문에 File API 는 표준으로 제안 되었으며 대부분의 브라우저에서 구현되었습니다 ( FileReader아직 API는 아니지만 여기에 설명 된 API에 대한 지원을 추가 한 IE 10 File기준). API는 파일의 비동기 읽기, 바이너리 파일에 대한 더 나은 지원 및 다른 텍스트 인코딩의 디코딩을 지원하도록 설계 되었기 때문에 이전 Mozilla API보다 약간 더 복잡합니다. 이 일부 모질라 개발자 네트워크에서 사용할 문서를 온라인뿐만 아니라 다양한 예. 다음과 같이 사용합니다.

var file = document.getElementById("fileForUpload").files[0];
if (file) {
    var reader = new FileReader();
    reader.readAsText(file, "UTF-8");
    reader.onload = function (evt) {
        document.getElementById("fileContents").innerHTML = evt.target.result;
    }
    reader.onerror = function (evt) {
        document.getElementById("fileContents").innerHTML = "error reading file";
    }
}

원래 답변

WebKit (따라서 Safari 및 Chrome)에서는이를 수행하는 방법이없는 것 같습니다. File 객체에 있는 유일한 키 는 fileName및 fileSize입니다. File 및 FileList 지원에 대한 커밋 메시지 에 따르면 Mozilla의 File 객체 에서 영감을 얻었 지만 기능의 하위 집합 만 지원하는 것으로 보입니다.

이를 변경하려면 항상 WebKit 프로젝트에 패치 를 보낼 수 있습니다. 또 다른 가능성은 HTML 5 에 포함될 Mozilla API를 제안하는 것입니다 . WHATWG의 메일 링리스트는 아마 그렇게 할 수있는 가장 좋은 장소입니다. 그렇게한다면 적어도 몇 년 안에이를 수행 할 수있는 브라우저 간 방법이있을 가능성이 훨씬 더 높습니다. 물론 패치 나 HTML 5 포함을위한 제안을 제출하는 것은 아이디어를 옹호하는 작업을 의미하지만, Firefox가 이미이를 구현하고 있다는 사실은 시작할 수있는 무언가를 제공합니다.


감사합니다.이 시점에서 패치를 제출할만큼 헌신적이지 않은 것 같습니다. 어쨌든 당신의 지식 없이는 일어나기를 원하지 않을 것입니다. 그것은 좀 ... 브라우저 샌드 박스를 나누기
— Damovisa

4
의도적으로 해당 파일을 업로드하도록 선택했기 때문에 브라우저 샌드 박스가 손상되지는 않습니다. 서버에 도달 할 수 있다면 추가 왕복으로 브라우저로 돌아갈 수 있습니다. 웹 앱에 대해 오프라인 모드를 작동시키는 작업을 감안할 때 이것은 합리적인 기능이 될 것입니다.
— Brian Campbell

음, 사실 그게 공정한 요점입니다. 해당 파일을 선택하기위한 사용자 상호 작용이있었습니다. 감사.
— Damovisa 2009

@Damovisa 나는 당신이 이것에 대해 여전히 관심이 있는지 모르겠지만, 당신이 찾고있는 것을 수행하고 Firefox, Chrome 및 야간 빌드에서 구현되는 새로운 파일 API를 언급하기 위해 내 대답을 업데이트 할 것이라고 생각했습니다. 원정 여행.
— Brian Campbell

훌륭합니다. 감사합니다. 나는 다른 일로 옮겼지만 답이 있다는 것을 아는 것이 좋다 :)
— Damovisa 2011

25

사용자가 선택한 파일을 읽기 위해서는 파일 열기 대화 상자를 사용하여 <input type="file">태그를 사용할 수 있습니다 . MSDN에서 정보를 찾을 수 있습니다 . 파일이 선택되면 FileReader API 를 사용 하여 내용을 읽을 수 있습니다.

function onFileLoad(elementId, event) {
    document.getElementById(elementId).innerText = event.target.result;
}

function onChooseFile(event, onLoadFileHandler) {
    if (typeof window.FileReader !== 'function')
        throw ("The file API isn't supported on this browser.");
    let input = event.target;
    if (!input)
        throw ("The browser does not properly implement the event object");
    if (!input.files)
        throw ("This browser does not support the `files` property of the file input.");
    if (!input.files[0])
        return undefined;
    let file = input.files[0];
    let fr = new FileReader();
    fr.onload = onLoadFileHandler;
    fr.readAsText(file);
}
<input type='file' onchange='onChooseFile(event, onFileLoad.bind(this, "contents"))' />
<p id="contents"></p>


Internet Explorer에서 작동하지 않습니다.
— Merwais Muafaq

4

즐거운 코딩 되세요!
Internet Explorer에서 오류가 발생하면 ActiveX를 허용하도록 보안 설정을 변경하십시오.

var CallBackFunction = function(content)
{
    alert(content);
}
ReadFileAllBrowsers(document.getElementById("file_upload"), CallBackFunction); 

//Tested in Mozilla Firefox browser, Chrome
function ReadFileAllBrowsers(FileElement, CallBackFunction)
{
try
{
    var file = FileElement.files[0];
    var contents_ = "";

     if (file) {
        var reader = new FileReader();
        reader.readAsText(file, "UTF-8");
        reader.onload = function(evt)
        {
            CallBackFunction(evt.target.result);
        }
        reader.onerror = function (evt) {
            alert("Error reading file");
        }
    }
}
catch (Exception)
 {
    var fall_back =  ieReadFile(FileElement.value);
    if(fall_back != false)
    {
        CallBackFunction(fall_back);
    }
 }
}

///Reading files with Internet Explorer
function ieReadFile(filename)
{
 try
 {
    var fso  = new ActiveXObject("Scripting.FileSystemObject");
    var fh = fso.OpenTextFile(filename, 1);
    var contents = fh.ReadAll();
    fh.Close();
    return contents;
 }
 catch (Exception)
  {
    alert(Exception);
    return false;
  }
 }

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