JavaScript를 사용하여 파일을 읽고 쓰는 방법?


177

누구나 JavaScript를 사용하여 파일을 읽고 쓰는 샘플 코드를 줄 수 있습니까?


2
왜 필요한가요? 해결 방법이있을 수 있습니다.
Ionuț G. Stan


1
실제로 여러 번 요청되었습니다
annakata

1
클라이언트 측 파일 스토리지와 관련하여이 리소스를 찾았습니다. html5rocks.com/ko/tutorials/offline/storage 내가 수집 한 것으로부터 HTML5는 실제로 Websights가 사용자의 로컬 하드 드라이브에 정보를 저장하지만보다 데이터베이스와 같은 매너에 저장할 수 있도록합니다. 브라우저는 파일 저장소를 관리하고 월드 와이드 웹이 사람들 하드 드라이브를 챙겨 넣지 못하도록 특정 제한을 부과합니다. 그들은 아직 완전히 바보 증거는 아니지만 적어도이 기사에 따르면 조정되고 있습니다. 자세한 내용을 읽으십시오.
개렛

2
Ajax를 사용하고 PHP는 파일 읽기 및 쓰기를 처리합니다. 파일 클라이언트쪽에 대한 쓰기를 처리하려면 잊어 버려야합니다. 서버에서 많은 보안 옵션을 비활성화해야하며 매우 안전하지 않은 사이트가 남아 있습니다. PHP를 사용하지 않으려면 JavaScript 쿠키를 사용하여 클라이언트 컴퓨터에 데이터를 저장하여 달성하고자하는 것을 수행 할 수 있습니다.
Dan Bray

답변:


64

완벽을 기하기 위해 OP는 브라우저 에서이 작업을 수행하려고한다고 명시하지 않습니다 (말한 것처럼 일반적으로 불가능합니다)

그러나 자바 스크립트 자체가이를 허용합니다. 서버 측 자바 스크립트로 수행 할 수 있습니다.

Javascript File 클래스 에서이 설명서를 참조하십시오.

편집 : 그 링크는 이제 Oracle에 의해 옮겨진 Sun 문서에 대한 링크였습니다.

시간을 지키기 위해 FileSystem 클래스에 대한 node.js 문서가 있습니다. http://nodejs.org/docs/latest/api/fs.html

편집 (2) : HTML5를 사용하여 클라이언트 측에서 파일을 읽을 수 있습니다 : http://www.html5rocks.com/en/tutorials/file/dndfiles/


3
HTML5를 사용하여 로컬 파일에 쓸 수 있습니까?
Anderson Green

1
또한 상황에 따라 PHP 스크립트를 아약스 호출하여 데이터를 덤프 할 수 있습니다. 이것은 자바 스크립트 측에서 생성 된 일부 데이터를 저장하고 싶었지만 그것이 어떻게 도착했는지는 중요하지 않은 상황에서 유용했습니다.
더스틴 그레이엄

1
@DustinGraham, 실제로 Chrome API를 사용 하면 실제로 JavaScript를 통해 클라이언트 측에 파일을 쓸 있습니까?
Pacerier

40

아니요. 브라우저 측 자바 스크립트는 많은 보안 옵션을 비활성화하지 않고 클라이언트 컴퓨터에 쓸 수있는 권한이 없습니다.


44
@marcgg :이 답변은 불완전하고 부정확하지 않습니다. 이 문제 OP의 사용 사례를 다루고 있을 가능성이 높습니다 .
궤도에서 가벼움 레이스

36
OP가 브라우저 외부에서 자바 스크립트를 사용할 계획이라면, 아마도 그것을 언급했을 정도로 드문 일입니다. 브라우저를 가정하는 것은 비합리적이지 않으며 (정확하지도 않습니다) 아닙니다. +1 (marcgg의 -1을 보충하기 위해).
Michael Martin-Smucker 12

2
@LightnessRacesinOrbit downvote 버튼이 답이 틀렸다고 생각되는 것은 아닙니다. 툴팁 텍스트는 This answer is not useful입니다.
Scruuffy

1
@Mike —이 답변이 작성된 시점이 아니 었으며 기본적으로 브라우저 쪽 JS를 가정하는 것이 합리적입니다.
Quentin

16

미래가 여기 있습니다! 제안은 완성에 가까워지고 더 이상 ActiveX 또는 플래시 또는 Java가 아닙니다. 이제 우리는 사용할 수 있습니다 :

끌어서 놓기를 사용하여 파일을 브라우저로 가져 오거나 간단한 업로드 컨트롤을 사용할 수 있습니다. 사용자가 파일을 선택하면 Javascript를 통해 읽을 수 있습니다. http://www.html5rocks.com/en/tutorials/file/dndfiles/


링크가 끊어졌습니다.
Prometheus

링크가 다시 끊어졌고, 둘 다 동일한 링크이지만 다른 의미를 가지고 있습니다.
insidesin

@insidesin fixed
Thomas Shields

14

다음은 모질라 제안입니다

http://www-archive.mozilla.org/js/js-file-object.html

이것은 Spidermonkey와 Adobe의 extendscript에서 컴파일 스위치로 구현됩니다. 또한 Firefox 확장자로 File 객체를 얻습니다.

코뿔소에는 (소설적인) readFile 기능이 있습니다 https://developer.mozilla.org/en/Rhino_Shell

rhino에서보다 복잡한 파일 조작을 위해 java.io.File 메소드를 사용할 수 있습니다.

당신은 브라우저 에서이 물건을 얻지 못할 것입니다. 브라우저에서 유사한 기능을 수행하려면 HTML5, 클라이언트 측 지속성, 쿠키 및 플래시 스토리지 오브젝트의 SQL 데이터베이스 기능을 사용할 수 있습니다.


12

이 Javascript 기능은 브라우저를 통해이를 실행하는 사용자에게 완전한 "다른 이름으로 저장"대화 상자를 제공합니다. 사용자가 OK를 누르면 파일이 저장됩니다.

편집 : 다음 코드는 Firefox 및 Chrome 에서이 코드를 보안 문제로 간주하여 작동하지 못하도록 IE 브라우저에서만 작동합니다.

// content is the data you'll write to file<br/>
// filename is the filename<br/>
// what I did is use iFrame as a buffer, fill it up with text
function save_content_to_file(content, filename)
{
    var dlg = false;
    with(document){
     ir=createElement('iframe');
     ir.id='ifr';
     ir.location='about.blank';
     ir.style.display='none';
     body.appendChild(ir);
      with(getElementById('ifr').contentWindow.document){
           open("text/plain", "replace");
           charset = "utf-8";
           write(content);
           close();
           document.charset = "utf-8";
           dlg = execCommand('SaveAs', false, filename+'.txt');
       }
       body.removeChild(ir);
     }
    return dlg;
}

함수를 호출하십시오.

save_content_to_file("Hello", "C:\\test");

1
ir = createElement ( 'iframe'); -iframe은 iFrame ID입니다.
Temp

또한 유효한 파일 위치를 선택하는 한 모든 운영 체제에서 작동합니까?
Anderson Green

4
이것은 좋은 해결책이지만 IE에서만 작동합니까? IE와 FF를 시도했지만 FF로는 작동하지 않습니다.
u.gen

9

JScript (Microsoft의 Javascript)를 사용하여 WSH (브라우저가 아님)를 사용하여 로컬 스크립팅을 수행하는 Scripting.FileSystemObject경우 파일 시스템에 액세스 할 수 있습니다 .

많은 보안 설정을 끄면 IE에서 동일한 객체에 액세스 할 수 있다고 생각하지만 이는 매우 나쁜 생각입니다.

여기 MSDN


나는 이것을 hta어플리케이션에서하고
싶었고

8

현재 File , FileWriterFileSystem API 를 사용하여 브라우저 탭 / 창의 컨텍스트에서 파일을 읽고 읽을 수 있지만 사용에 대한주의 사항이 있습니다 (이 답변의 꼬리 부분 참조).

그러나 귀하의 질문에 대답하려면 :

BakedGoods 사용 *

파일 쓰기 :

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);

바로 당신이 뭘 바랐나요? 그럴 수도 있고 아닐 수도 있고. 후자의 두 API :

  • 현재 Chromium 기반 브라우저 (Chrome & Opera)에서만 구현됩니다.
  • W3C 표준 트랙에서 벗어 났으며 현재로서는 독점 API입니다
  • 향후 구현 브라우저에서 제거 될 수 있음
  • 디스크 에서 파일 생성을 샌드 박스 ( 파일 외부에서 영향을 줄 수있는 위치)로 제한

또한 FileSystem 스펙은 디렉토리 구조가 디스크에 표시되는 방법에 대한 지침을 정의하지 않습니다. 예를 들어 Chromium 기반 브라우저에서 샌드 박스에는 가상 파일 시스템 (브라우저 내에서 액세스 할 때와 동일한 형식으로 디스크에 반드시 존재하지 않아도되는 디렉토리 구조)이 있으며이 디렉토리 내에서 API가 배치됩니다.

따라서 API를 사용하여 시스템에 파일을 쓸 수는 있지만 API없이 파일을 찾는 경우 (FileSystem API가없는 경우) 사소한 일이 될 수 있습니다.

이러한 문제 / 제한 사항을 처리 할 수 ​​있다면 이러한 API는 요청한 것을 수행하는 유일한 기본 방법입니다.

네이티브가 아닌 솔루션을 사용하는 경우 Silverlight를 사용하면 IsolatedStorage를 통해 탭 / 창 컨테스트에서 파일 I / O를 허용 할 수도 있습니다 . 그러나이 기능을 사용하려면 관리 코드 가 필요합니다. 이러한 코드를 작성해야하는 솔루션은이 질문의 범위를 벗어납니다.

물론 보완적인 관리 코드를 사용하고 Javascript 만 작성하여 작성하는 솔루션은이 질문의 범위 내에 있습니다.

//Write file to first of either FileSystem or IsolatedStorage
bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem", "silverlight"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

* BakedGoods는 모든 기본 및 비원시 스토리지 시설에서 공통 스토리지 작업을 수행하는 데 사용할 수있는 균일 한 인터페이스를 설정하는 Javascript 라이브러리입니다. 이 녀석이 여기에 의해 관리됩니다 :).



5

브라우저와 관련하여 Javascript는 사용자 지정 파일을 읽을 수 있습니다. File API를 사용한 파일 읽기에 대한 자세한 내용은 Eric Bidelman의 블로그 를 참조하십시오 . 그러나 브라우저 기반 Javascript는 일부 웹 사이트가 로컬 파일 시스템을 임의로 변경하는 보안 위협으로 간주되기 때문에 일부 보안 설정을 비활성화하지 않고 로컬 컴퓨터의 파일 시스템을 쓸 수 없습니다.

말하자면, 당신이하려는 일에 따라 그것을 해결할 수있는 몇 가지 방법이 있습니다.

  1. 자신의 사이트 인 경우 웹 페이지에 Java 애플릿을 포함시킬 수 있습니다. 그러나 방문자는 로컬 시스템에 Java를 설치해야하며 보안 위험에 대해 경고합니다. 방문자는 애플릿을로드 할 수 있어야합니다. Java 애플릿은 로컬 컴퓨터에 완전히 액세스 할 수있는 실행 소프트웨어와 같습니다.

  2. Chrome은 로컬 파일 시스템의 샌드 박스 부분 인 파일 시스템을 지원합니다. 자세한 내용은 이 페이지 를 참조하십시오. 이를 통해 일시적으로 항목을 로컬로 저장할 수 있습니다. 그러나 다른 브라우저에서는이 기능을 지원하지 않습니다.

  3. 브라우저에만 국한되지 않으면 Node.js에는 완전한 파일 시스템 인터페이스가 있습니다. 파일 시스템 설명서 는 여기를 참조하십시오 . Node.js는 서버뿐만 아니라 Windows를 포함한 모든 클라이언트 컴퓨터에서도 실행될 수 있습니다. 자바 스크립트 테스트 러너 Karma는 Node.js를 기반으로합니다. 로컬 컴퓨터에서 자바 스크립트로 프로그래밍하려는 경우 옵션입니다.


3

파일을 만들려면

function makefile(){
  var fso;
  var thefile;

    fso = new ActiveXObject("Scripting.FileSystemObject");
    thefile=fso.CreateTextFile("C:\\tmp\\MyFile.txt",true);

    thefile.close()
    }

Windows는 C 드라이브에 "tmp"라는 폴더를 작성하는 등 웹 쓰기에 대한 보안이 있으므로 C 드라이브에 디렉토리를 작성하십시오.


2

Flash, Java 또는 Silverlight로 전환해야합니다. Silverlight의 경우 격리 된 저장소 를 볼 수 있습니다 . 그러면 사용자 디스크의 놀이터에서 파일을 쓸 수 있습니다. 그래도 놀이터 밖에서는 쓸 수 없습니다.


1

크로스 브라우저 방식으로는이 작업을 수행 할 수 없습니다. IE에는 "신뢰할 수있는"응용 프로그램이 ActiveX 개체를 사용하여 파일을 읽고 쓸 수 있도록하는 방법이 있지만 불행히도 그럴 것입니다.

사용자 정보를 저장하려면 쿠키를 사용해야합니다.


4
"신뢰할 수있는"응용 프로그램이되기위한 장벽은 정확히 무엇입니까? 확인 대화?
Breton

@Philip, 아무도 크로스 브라우저가 필요하다고 말하지 않았습니다. 각 브라우저마다 다른 솔루션이 좋습니다.
Pacerier

1

ReactJS 테스트에서 다음 코드는 파일을 성공적으로 작성합니다.

import writeJsonFile from 'write-json-file';

const ans = 42;
writeJsonFile('answer.txt', ans);

const json = {"answer": ans};
writeJsonFile('answer_json.txt', json);

파일은 테스트가 포함 된 디렉토리에 작성되므로 실제 JSON 파일 '* .json'에 쓰면 루프가 생성됩니다!


0

보안 상 위험하므로 javascript를 사용하여 클라이언트 측에서 파일 입출력을 수행 할 수 없습니다. exe를 다운로드하여 실행하도록하거나 파일이 서버에있는 경우 AJAX 및 PHP와 같은 서버 측 언어를 사용하여 서버 측에서 I / O를 수행해야합니다.


1
이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 의견을 남기십시오.
harpun

@harpun, 정확합니다. 이 답변을 삭제하고 주석으로 변환하십시오.
Pacerier

0

JavaScript를 사용하여 파일을 읽고 쓰는 두 가지 방법이 있습니다

  1. JavaScript 확장 사용

  2. 웹 페이지 및 Active X 개체 사용


-1

다음은 크롬 v52 +에 대한 쓰기 솔루션입니다 (사용자는 여전히 목적지를 선택해야합니다 ...)
출처 : StreamSaver.js

<!-- load StreamSaver.js before streams polyfill to detect support -->
<script src="StreamSaver.js"></script>
<script src="https://wzrd.in/standalone/web-streams-polyfill@latest"></script>
const writeStream = streamSaver.createWriteStream('filename.txt')
const encoder = new TextEncoder
let data = 'a'.repeat(1024)
let uint8array = encoder.encode(data + "\n\n")

writeStream.write(uint8array) // must be uInt8array
writeStream.close()

클라이언트 측에서 생성 된 대용량 데이터를 작성하는 데 가장 적합합니다.
그렇지 않으면 FileSaver.js 를 사용하여 Blob / Files를 저장 하는 것이 좋습니다.

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