JavaScript를 통한 로컬 파일 액세스


177

JavaScript로 수행 된 로컬 파일 조작이 있습니까? Adobe AIR 필요와 같은 설치 공간없이 달성 할 수있는 솔루션을 찾고 있습니다 .

특히, 파일에서 내용을 읽고 해당 내용을 다른 파일에 쓰고 싶습니다. 이 시점에서 나는 권한을 얻는 것에 대해 걱정하지 않고 이미 이러한 파일에 대한 모든 권한을 가지고 있다고 가정합니다.


답변:


87

사용자가 파일을 통해 선택하면 <input type="file">, 당신은 수 읽기과정 파일이 사용하여 해당 파일 API를 .

의도적으로 임의의 파일을 읽거나 쓰는 것은 허용되지 않습니다. 샌드 박스를 위반 한 것입니다. 에서 위키 백과 -> 자바 스크립트 -> 보안 :

JavaScript와 DOM은 악의적 인 작성자가 웹을 통해 클라이언트 컴퓨터에서 실행할 스크립트를 제공 할 수있는 가능성을 제공합니다. 브라우저 작성자는 두 가지 제한 사항을 사용하여이 위험을 포함합니다. 먼저 스크립트는 샌드 박스에서 실행되며 파일 작성 과 같은 범용 프로그래밍 작업이 아니라 웹 관련 작업 만 수행 할 수 있습니다 .

2016 UPDATE : 직접 파일 시스템을 액세스하는 것은 통해 가능하다 파일 시스템 API 되고, 단지 크롬과 오페라에서 지원 하고 다른 브라우저에 의해 구현되고 있지 끝낼 수 있습니다 합니다 (와 에지의 예외 ). 자세한 내용은 Kevin의 답변을 참조하십시오 .


28
제길. 물론 이것은 바보입니다. Javascript는 아마도 응용 프로그램에 독립적 인 스크립팅 언어입니다. 모든 응용 프로그램이 웹 브라우저 인 것은 아닙니다. 예를 들어 Photoshop 스크립팅에 관심이 있기 때문에 여기에 왔습니다. 일부 응용 프로그램은 파일 액세스 클래스를 제공하지 않더라도 표준이지만 선택적인 기능인 적절한 응용 프로그램에 대해 표준화하는 것이 합리적이므로 한 응용 프로그램의 경험은 보편적으로 적용되지 않더라도 전송할 수 있습니다. Photoshop에서 배운 내용은 파일 액세스를 허용하는 다른 Javascript 호스트로도 이식 할 수 없습니다.
Steve314

27
Javascript 언어로 호스팅 환경에서 허용하는 모든 작업을 수행하십시오. SpiderMonkey는 다른 언어로 할 수있는 모든 것을 할 수 있습니다. 브라우저의 자바 스크립트 는 샌드 박스입니다.

35
이 답변은 3 년 전에는 정확했지만 더 이상 정확하지는 않습니다. HTML5에 대한 @Horst Walter의 답변을 참조하십시오. 또는 여기로 가십시오 : html5rocks.com/en/tutorials/file/dndfiles
james.garriss

@ james.garriss 그래, 실제로 3 년 전에는 그다지 정확하지 않았다. 이 페이지는 읽는 방법을 가르쳐 / 파이어 폭스 2003 년에 다시와 쓰기 web.archive.org/web/20031229011919/http://www.captain.at/... (bulit XUL뿐만 사용할 수있는 브라우저에서 XPCOM과) 및 Microsoft가 있었다 1990 년대 node.js 스타일 javscript 쉘 스크립팅 (및 ActiveX를 사용하여 브라우저에서 FileIO 사용 가능)
original_username

더 이상 불가능
SysDragon

158

HTML5 기능의 업데이트는 http://www.html5rocks.com/en/tutorials/file/dndfiles/에 있습니다. 이 훌륭한 기사는 JavaScript에서 로컬 파일 액세스에 대해 자세히 설명합니다. 언급 된 기사의 요약 :

이 사양은 'local'파일 시스템에서 파일액세스하기 위한 몇 가지 인터페이스를 제공합니다 .

  1. 파일-개별 파일; 이름, 파일 크기, MIME 유형 및 파일 핸들에 대한 참조와 같은 읽기 전용 정보를 제공합니다.
  2. FileList-배열과 비슷한 File 객체 시퀀스입니다. <input type="file" multiple>데스크탑에서 파일 디렉토리를 생각 하거나 드래그 하십시오 .
  3. Blob-파일을 바이트 범위로 분할 할 수 있습니다.

아래의 Paul D. Waite의 의견을 참조하십시오.


7
Java 또는 Flash 플러그인을 사용하는 것과 같은 진정한 파일 시스템이 아닙니다. 예를 들어, 사용자가 파일을 먼저 선택하지 않으면 사용자의 데스크탑에 파일을 나열 할 수 없습니다.
Pacerier

9
이러한 API가 폐기 된 것 같습니다 : w3.org/TR/file-writer-apihtml5rocks.com/en/tutorials/file/filesystem
Paul D. Waite

4
유용한 기술을 빼앗아 가기위한 W3C 형식을 고려할 때주의하십시오. 크롬으로 만 구현 된 파일 시스템 API는 앞으로 나아 가지 않습니다. 파일 API는, 보편적있다 지원하는로 받아 들여 W3C의 작업 초안 우리는 더 이상없는 생활을 상상할 수 없습니다. 물론 우리는 여전히 브라우저를 사용하고 있으며 사용자가 파일을 가져올 때까지 기다려야하지만, 이는 웹 앱의 범위를 크게 확장 시키며 곧 사라지지 않을 것입니다.
bbsimonbb

21

업데이트이 기능은 Firefox 17부터 제거되었습니다 ( https://bugzilla.mozilla.org/show_bug.cgi?id=546848 참조 ).


Firefox에서는 (프로그래머) JavaScript 파일 내에서이를 수행 할 수 있습니다.

netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");

그리고 귀하 (브라우저 사용자)에게 액세스를 허용하라는 메시지가 표시됩니다. (Firefox의 경우 브라우저를 시작할 때마다이 작업을 수행하면됩니다.)

브라우저 사용자가 다른 사람인 경우 권한을 부여해야합니다.


6
이것은 더 이상 사용되지 않는다는 오류를 제공하며 웹 사이트 javascript가 아닌 확장에서만이 작업을 수행 할 수 있습니다
Esailija

4
이 링크에서 알 수 있듯이이 기능은 이후 버전의 Firefox에서 제거되었습니다. support.mozilla.org/en-US/questions/944433
Makan Tayebi

3
오, 짜증나 나는 보안과 그 모든 것을 얻지 만, 우리 자신의 자바 스크립트 파일을 로컬에서 실행하려면 신뢰를 부여 할 방법이 필요합니다.
Jason S

확실한. 그리고 아직 다른 방법을 찾지 못했습니다.
Makan Tayebi

2
더 이상 사용되지 않는 것으로 표시되도록 답변을 업데이트하십시오. 감사.
jpaugh

20

앞에서 언급 한 것처럼 FileWriter API 와 함께 FileSystemFile API를 사용하여 브라우저 탭 / 창의 컨텍스트에서 클라이언트 시스템으로 파일을 읽고 쓸 수 있습니다.

FileSystem 및 FileWriter API와 관련하여 몇 가지 알아야 할 사항이 있지만 그중 일부는 언급되었지만 반복 할 가치가 있습니다.

  • API 구현은 현재 Chromium 기반 브라우저 (Chrome & Opera)에만 존재합니다.
  • 두 API 모두 2014 년 4 월 24 일 W3C 표준 트랙에서 제거되었으며 현재는 독점적입니다.
  • 향후 브라우저 구현에서 (현재 독점적 인) API를 제거 할 가능성이 있습니다
  • 샌드 박스 (파일이 더 효과를 얻을 수있는 디스크의 외부에 위치)은 API를 사용하여 생성 된 파일을 저장하는 데 사용
  • 가상 파일 시스템 사용 (반드시이 브라우저 내에서 액세스 않는 것과 같은 형태로 디스크에 존재하지 않는 디렉토리 구조) API를 사용하여 만든 파일을 나타냅니다

다음은 이러한 작업을 수행하기 위해 API가 직간접 적으로 사용되는 방법에 대한 간단한 예입니다.

구운 상품 *

파일 쓰기 :

bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

파일 읽기 :

bakedGoods.get({
        data: ["testFile"],
        storageTypes: ["fileSystem"],
        options: {fileSystem:{storageType: Window.PERSISTENT}},
        complete: function(resultDataObj, byStorageTypeErrorObj){}
});

원시 파일, FileWriter 및 FileSystem API 사용

파일 쓰기 :

function onQuotaRequestSuccess(grantedQuota)
{

    function saveFile(directoryEntry)
    {

        function createFileWriter(fileEntry)
        {

            function write(fileWriter)
            {
                var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
                fileWriter.write(dataBlob);              
            }

            fileEntry.createWriter(write);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: true, exclusive: true},
            createFileWriter
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

파일 읽기 :

function onQuotaRequestSuccess(grantedQuota)
{

    function getfile(directoryEntry)
    {

        function readFile(fileEntry)
        {

            function read(file)
            {
                var fileReader = new FileReader();

                fileReader.onload = function(){var fileData = fileReader.result};
                fileReader.readAsText(file);             
            }

            fileEntry.file(read);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: false},
            readFile
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, getFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

FileSystem 및 FileWriter API는 더 이상 표준 트랙에 있지 않지만 다음과 같은 이유로 일부 경우에 사용이 정당화 될 수 있습니다.

  • 구현되지 않은 브라우저 공급 업체의 새로운 관심으로 다시 브라우저를 배치 할 수 있습니다.
  • (크롬 기반) 브라우저 구현의 시장 침투력이 높음
  • Google (Chromium의 주요 기여자)이 API에 대해 수명을 다하지 않았습니다.

그러나 "일부 사례"가 자신의 사례를 포함하는지 여부는 귀하가 결정하는 것입니다.

* BakedGoods는이 사람 이외의 다른 사람에 의해 유지됩니다 :)


7

NW.js를 사용하면 일반적으로 브라우저에 적용되는 모든 보안 제한없이 Javascript를 사용하여 데스크탑 응용 프로그램을 만들 수 있습니다. 따라서 함수로 실행 파일을 실행하거나 파일을 작성 / 편집 / 읽기 / 쓰기 / 삭제할 수 있습니다. 현재 CPU 사용량 또는 사용중인 총 램 등과 같은 하드웨어에 액세스 할 수 있습니다.

설치가 필요없는 Windows, Linux 또는 Mac 데스크탑 응용 프로그램을 만들 수 있습니다.

다음은 Universal GUI 인 NW.js의 프레임 워크입니다.


1
JavaScript 데스크톱 응용 프로그램과 유사한 프레임 워크 인 Electron을 사용하여 로컬 파일에 액세스 할 수도 있습니다 .
앤더슨 그린

6

Windows에 배포하는 경우 Windows 스크립트 호스트 는 파일 시스템 및 기타 로컬 리소스에 매우 유용한 JScript API를 제공합니다. 그러나 WSH 스크립트를 로컬 웹 응용 프로그램에 통합하는 것은 원하는만큼 우아하지 않을 수 있습니다.


3
맥 플랫폼을위한 비교 솔루션이없는 한 윈도우 스크립트 호스트는, 그것을 만족하지 않도록 나는, OS 독립적 (적어도 Windows와 Mac 사이) 될 수있는 솔루션을하고 싶습니다
자레드

5

다음과 같은 입력 필드가 있다면

<input type="file" id="file" name="file" onchange="add(event)"/>

BLOB 형식으로 컨텐츠를 파일링 할 수 있습니다.

function add(event){
  var userFile = document.getElementById('file');
  userFile.src = URL.createObjectURL(event.target.files[0]);
  var data = userFile.src;
}

4

FSO.js 는 W3C에서 표준화하고있는 새로운 HTML5 FileSystem API를 감싸고 로컬 샌드 박스 파일 시스템에서 읽고 쓰거나 통과 하는 매우 쉬운 방법을 제공합니다 . 비동기식이므로 파일 I / O가 사용자 경험을 방해하지 않습니다. :)


1
FSO.js는 현재 IE, Mozilla 또는 Safari에서 지원되지 않습니다.
Phillip Senn

2

클라이언트의 전체 파일 시스템에 액세스하거나, 파일을 읽고 / 쓰거나, 폴더의 변경 사항을 감시하고, 응용 프로그램을 시작하고, 문서를 암호화 또는 서명하는 등 JSFS를 살펴보십시오.

AcitveX 또는 Java Applet과 같은 브라우저 플러그인 기술을 사용하지 않고도 웹 페이지에서 클라이언트의 컴퓨터 리소스로 안전하고 무제한으로 액세스 할 수 있습니다. 그러나 소프트웨어의 평화도 설치해야합니다.

JSFS를 사용하려면 Java 및 Java EE 개발 (서블릿)에 대한 기본 지식이 있어야합니다.

https://github.com/jsfsproject/jsfs에서 JSFS를 찾으십시오 . 무료이며 GPL에 따라 라이센스가 부여됩니다


1

JavaScript 코드가 필요할 수있는 파일을 사용자가 직접 허용해야한다고 가정합니다. 유명한 브라우저 제작자는 JavaScript가 파일에 액세스 할 수 없습니다.

솔루션의 주요 아이디어는 다음과 같습니다. JavaScript 코드는 로컬 URL을 사용하여 파일에 액세스 할 수 없습니다. 그러나 DataURL을 사용하여 파일을 사용할 수 있습니다. 따라서 사용자가 파일을 찾아서 열면 JavaScript는 "URL"대신 HTML에서 "DataURL"을 직접 가져와야합니다.

그런 다음 readAsDataURL 함수와 FileReader 객체를 사용하여 DataURL을 파일로 변환합니다. 좋은 예를 가진 소스와 더 완벽한 가이드는 다음과 같습니다.

https://developer.mozilla.org/en-US/docs/Web/API/FileReader?redirectlocale=en-US&redirectslug=DOM%2FFileReader


0

클라이언트 컴퓨터에서 전체 파일 시스템을 읽고 쓰는 데 사용할 수있는 "localFS"(상업용) 제품이 있습니다.

작은 Windows 앱이 설치되어 있고 페이지에 작은 .js 파일이 포함되어 있어야합니다.

보안 기능으로서 파일 시스템 액세스는 하나의 폴더로 제한되고 비밀 키로 보호 될 수 있습니다.

https://www.fathsoft.com/localfs


-4

angularjs & aspnet / mvc를 사용하여 json 파일을 검색하는 경우 웹 구성에서 MIME 유형을 허용해야합니다

<staticContent>
    <remove fileExtension=".json" />
    <mimeMap fileExtension=".json" mimeType="application/json" />
  </staticContent>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.