[javascript] HTML5 / JavaScript를 사용하여 파일 생성 및 저장

최근에 WebGL을 다루고 있으며 Collada 리더가 작동하고 있습니다. 문제는 꽤 느리다는 것입니다 (Collada는 매우 장황한 형식입니다). 파일을 사용하기 쉬운 형식 (아마 JSON)으로 변환하기 시작합니다. JavaScript로 파일을 구문 분석하는 코드가 이미 있으므로 내보내기 프로그램으로도 사용할 수 있습니다! 문제가 해결되었습니다.

이제 파일을 구문 분석하고 결과를 서버로 보내고 브라우저가 서버에서 다운로드로 파일을 다시 요청할 수 있음을 알고 있습니다. 그러나 실제로 서버는이 특정 프로세스와 아무 관련이 없기 때문에 왜 관여해야합니까? 메모리에 원하는 파일의 내용이 이미 있습니다. 순수한 JavaScript를 사용하여 다운로드를 사용자에게 표시 할 수있는 방법이 있습니까? (나는 그것을 의심하지만 물어볼 수도 있습니다 …)

그리고 분명히하기 위해 : 사용자 모르게 파일 시스템에 액세스하려고하지 않습니다! 사용자는 파일 (아마 드래그 앤 드롭을 통해)을 제공하고 스크립트는 파일을 메모리로 변환하며 결과를 다운로드하라는 메시지가 표시됩니다. 브라우저에 관한 한 모든 작업은 “안전한”활동이어야합니다.

[편집] : 앞서 언급하지 않았으므로 “플래시”라고 답한 포스터는 충분히 유효하지만 내가하고있는 작업의 일부는 순수한 HTML5로 수행 할 수있는 작업을 강조하려는 시도입니다. 내 경우에는 바로. (이것은 “실제”웹 앱을하는 사람에게는 완벽하게 유효한 답변이지만) 서버를 사용하고 싶지 않다면 운이 좋지 않은 것 같습니다. 어쨌든 고마워!



답변

OK, 데이터 생성 : Matthew와 Dennkster가 그 옵션을 지적함으로써 URI가 나를 위해 속임수를 쓰지 않습니다! 기본적으로 내가하는 방법은 다음과 같습니다.

1) 모든 내용을 “content”라는 문자열로 가져옵니다 (예 : 처음에 작성하거나 이미 작성된 페이지 태그의 innerHTML을 읽음).

2) 데이터 URI를 빌드하십시오.

uriContent = "data:application/octet-stream," + encodeURIComponent(content);

브라우저 유형 등에 따라 길이 제한이 있지만 Firefox 3.6.12는 256k 이상까지 작동합니다. encodeURIComponent를 대신 사용하여 Base64로 인코딩하면 작업이 더 효율적일 수 있지만 나에게는 괜찮습니다.

3) 새 창을 열고이 URI로 “리디렉션”하면 JavaScript로 생성 된 페이지의 다운로드 위치를 묻는 메시지가 표시됩니다.

newWindow = window.open(uriContent, 'neuesDokument');

그게 다야.


답변

HTML5 지원 브라우저를위한 간단한 솔루션 …

function download(filename, text) {
    var pom = document.createElement('a');
    pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    pom.setAttribute('download', filename);

    if (document.createEvent) {
        var event = document.createEvent('MouseEvents');
        event.initEvent('click', true, true);
        pom.dispatchEvent(event);
    }
    else {
        pom.click();
    }
}

용법

download('test.txt', 'Hello world!');


답변

HTML5는 window.saveAs(blob, filename)메소드를 정의했습니다 . 현재 모든 브라우저에서 지원되지 않습니다. 그러나 대부분의 최신 브라우저 (Internet Explorer 10 이상 포함)에이 기능을 추가하는 FileSaver.js 라는 호환성 라이브러리가 있습니다. Internet Explorer 10은 Internet Explorer 지원을 위해 FileSaver.js에서 사용되는 navigator.msSaveBlob(blob, filename)방법 ( MSDN )을 지원합니다.

이 문제에 대한 자세한 내용이 담긴 블로그 게시물 을 작성했습니다 .


답변

큰 파일 저장

긴 데이터 URI는 브라우저에서 성능 문제를 일으킬 수 있습니다. 클라이언트 측에서 생성 된 파일을 저장하는 또 다른 옵션은 해당 컨텐츠를 Blob (또는 File) 오브젝트에 넣고를 사용하여 다운로드 링크를 작성하는 것 URL.createObjectURL(blob)입니다. Blob의 내용을 검색하는 데 사용할 수있는 URL을 반환합니다. Blob은 URL.revokeObjectURL()URL에서 호출되거나이를 생성 한 문서가 닫힐 때까지 브라우저 내부에 저장됩니다 . 대부분의 웹 브라우저는 객체 URL지원하며 Opera Mini는이를 지원하지 않는 유일한 URL 입니다.

다운로드 강제

데이터가 텍스트 또는 이미지 인 경우 브라우저는 파일을 디스크에 저장하는 대신 파일을 열 수 있습니다. 링크를 클릭 할 때 파일이 다운로드되도록하려면 download속성을 사용할 수 있습니다 . 그러나 모든 웹 브라우저가 다운로드 속성을 지원 하지는 않습니다 . 다른 옵션은 application/octet-stream파일의 MIME 유형으로 사용하는 것이지만 파일 이름을 지정하지 않거나 지정할 수없는 경우 파일이 이진 얼룩으로 표시됩니다. ‘참조 열기에 힘을 “다른 이름으로 저장 …”HTML에서 PDF의 텍스트 링크를 클릭에서 열린 팝업 ‘.

파일 이름 지정

Blob이 File 생성자로 생성 된 경우 파일 이름을 설정할 수도 있지만 Chrome 및 Firefox를 포함한 일부 웹 브라우저에서만 File 생성자를 지원합니다 . 파일 이름을 download속성에 대한 인수로 지정할 수도 있지만 이는 수많은 보안 고려 사항 이 적용 됩니다 . Internet Explorer 10 및 11은 고유 한 방법 인 msSaveBlob을 제공 하여 파일 이름을 지정합니다.

예제 코드

var file;
var data = [];
data.push("This is a test\n");
data.push("Of creating a file\n");
data.push("In a browser\n");
var properties = {type: 'text/plain'}; // Specify the file's mime-type.
try {
  // Specify the filename using the File constructor, but ...
  file = new File(data, "file.txt", properties);
} catch (e) {
  // ... fall back to the Blob constructor if that isn't supported.
  file = new Blob(data, properties);
}
var url = URL.createObjectURL(file);
document.getElementById('link').href = url;
<a id="link" target="_blank" download="file.txt">Download</a>


답변

function download(content, filename, contentType)
{
    if(!contentType) contentType = 'application/octet-stream';
        var a = document.createElement('a');
        var blob = new Blob([content], {'type':contentType});
        a.href = window.URL.createObjectURL(blob);
        a.download = filename;
        a.click();
}


답변

이를 위해 Flash 기반 JavaScript 인터페이스 인 Doug Neiner의 Downloadify 를 살펴보십시오 .

Downloadify는 서버 상호 작용없이 브라우저에서 파일을 즉시 생성하고 저장할 수있는 작은 JavaScript + Flash 라이브러리입니다.


답변

간단한 해결책!

<a download="My-FileName.txt" href="data:application/octet-stream,HELLO-WORLDDDDDDDD">Click here</a>

모든 최신 브라우저에서 작동합니다.