데이터 URL 파일 다운로드


127

누구나 브라우저에서 액세스 할 수있는 완전한 JavaScript 기반 zip / unzip 유틸리티를 만드는 아이디어를 가지고 놀았습니다. zip을 브라우저로 직접 드래그하면 그 안에있는 모든 파일을 다운로드 할 수 있습니다. 개별 파일을 끌어서 새 zip 파일을 만들 수도 있습니다.

서버 측에서하는 것이 더 낫다는 것을 알고 있지만이 프로젝트는 약간의 재미를위한 것입니다.

사용 가능한 다양한 방법을 활용하면 파일을 브라우저로 드래그하는 것이 충분히 쉬울 것입니다. (Gmail 스타일)

인코딩 / 디코딩은 괜찮을 것입니다. 나는 as3 zip 라이브러리를 봤기 때문에 괜찮을 것이라고 확신합니다.

내 문제는 마지막에 파일을 다운로드하는 것입니다.

window.location = 'data:jpg/image;base64,/9j/4AAQSkZJR....' 

이것은 파이어 폭스에서는 잘 작동하지만 크롬에서는 작동하지 않습니다.

를 사용하여 크롬에서 파일을 이미지로 포함 할 수 <img src="data:jpg/image;ba.." />있지만 파일이 반드시 이미지 일 필요는 없습니다. 모든 형식이 될 수 있습니다.

누구든지 다른 해결책이나 어떤 종류의 해결 방법을 생각할 수 있습니까?


현재 지원은 , 불행하게도, 다소 제한
Casebash

답변:


42

아이디어 :

  • <a href="data:...." target="_blank">(테스트되지 않음) 시도

  • 데이터 URL 대신 downloadify 사용 (IE에서도 작동 함)


@jcubic 죽은 링크를 지적 해 주셔서 감사합니다. 새로운 다운로드 위치는 github.com/dcneiner/Downloadify입니다
Pekka

Flash를 사용할 수 없지만 Java 서버 측 구성 요소를 실행하는 경우 github.com/suprememoocow/databounce를 사용할 수 있습니다 . Servlet을 사용하여 클라이언트에서 데이터를 '바운스'합니다. Python, ASP.NET 등과 같은 다른 서버 측 기술에서 동일한 트릭을 수행하는 것은 매우 쉽습니다.
Andrew Newdigate 2011

플래시없이 할 수있는 방법이 있습니까? IE를 제외한 모든 브라우저의 데이터 URL과 IE 용 ActiveX foo? (이렇게하면 플래시없이 음악을 재생할 수있었습니다. 모든 브라우저에서 HTML5 오디오를 사용하고 IE에서는 IE를 사용했습니다.)
panzi

Downloadify는 브라우저에서 플래시 플레이어를 기대합니다. 사용자가 더 플래시 플레이어가없는 경우, 다음 파일을 다운로드하지 않습니다
Jeevanandan J에게

186

또한 파일에 제안 된 이름 (기본 '다운로드'대신)을 지정하려는 경우 Chrome, Firefox 및 일부 IE 버전에서 다음을 사용할 수 있습니다.

function downloadURI(uri, name) {
  var link = document.createElement("a");
  link.download = name;
  link.href = uri;
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  delete link;
}

그리고 다음 예제는 그 용도를 보여줍니다.

downloadURI("data:text/html,HelloWorld!", "helloWorld.txt");

6
당신과 함께 그것을 단순화 할 수 link.click()대신하여 eventFireα- 함수 ... jsfiddle.net/ARTsinn/Ezx5m
yckart

3
좋은 솔루션입니다. 그러나 링크는 무엇 이후에됩니까?
webshaker

6
'link'변수는 함수의 끝에서 범위를 벗어나므로 (dom에 추가 한 적이 없음) 곧 가비지 수집됩니다.
owencm 2014-08-25

8
이것은 Chrome에서만 작동합니다. Firefox / IE에서 작동하려면 @MartinoDino의 답변을 참조하십시오.
TrueWill

1
여기에 제안 된대로 download.js를 시도했는데 작동하는 것 같습니다. :)
joaorodr84

56

function download(dataurl, filename) {
  var a = document.createElement("a");
  a.href = dataurl;
  a.setAttribute("download", filename);
  a.click();
}

download("data:text/html,HelloWorld!", "helloWorld.txt");

또는:

function download(url, filename) {
fetch(url).then(function(t) {
    return t.blob().then((b)=>{
        var a = document.createElement("a");
        a.href = URL.createObjectURL(b);
        a.setAttribute("download", filename);
        a.click();
    }
    );
});
}

download("https://get.geojs.io/v1/ip/geo.json","geoip.json")
download("data:text/html,HelloWorld!", "helloWorld.txt");


존재하지 않는 요소에 대한 클릭 이벤트 : D appendchild가 필요하지 않습니다.
Zibri

1
예. 요소 'a'를 만든 후 a.click ()을 호출 한 다음 a의 href를 설정할 수 있습니다.
user1709076

과거에는 a.click ()을 직접 호출하면 작동하지 않지만 이벤트와 함께 작동합니다. 이제 둘 다 작동합니다.
Zibri

1
이것은 대부분의 최신 브라우저에서 작동하지만 일부 오래된 브라우저를 지원하려면 문서에 추가 한 다음 제거해야합니다.
owencm

3
두 번째 솔루션은 dataUri가 너무 커질 때마다 사용해야합니다 (브라우저에 따라 다르지만 Chrome은 내 경험상 여러 메가 바이트의 Uri를 허용하지 않음). stackoverflow.com/questions/38781968/… 도 참조하십시오 .
neural5torm

27

내 경험을 공유하고 누군가가 Firefox에서 작동하지 않는 다운로드 및 2014에 대한 업데이트 된 답변을 멈출 수 있도록 돕고 싶습니다. 아래 스 니펫은 firefox와 chrome 모두에서 작동하며 파일 이름을 허용합니다.

  // Construct the <a> element
  var link = document.createElement("a");
  link.download = thefilename;
  // Construct the uri
  var uri = 'data:text/csv;charset=utf-8;base64,' + someb64data
  link.href = uri;
  document.body.appendChild(link);
  link.click();
  // Cleanup the DOM
  document.body.removeChild(link);

4
불행히도 Safari에서는 작동하지 않습니다. Safari가 download속성 을 인식하지 못하는 것 같습니다 . 어쨌든 고마워요. 지금은 제가 할 수있는 한 가깝습니다.
Moritz Petersen 2014

이로 인해 창이 IE 11에서 href 값으로 리디렉션됩니다. prevetDefault (); IE의 동작을 중지하지 않습니다
b_dubb

1
덕분에, 또한 경우 btoa(예에서 노드 eslinted 프론트 엔드 프로젝트) 정의되지 않은 const btxt = new Buffer(text).toString('base64'); const uri = 'data:text/csv;charset=utf-8;base64,' + btxt + ';'
이반 Borshchov

2
링크를 삭제하는 것은 의미가 없으며 다음 줄에서 범위를 벗어나 가비지 수집되며 삭제 대상이 아닙니다.
macdja38

1
document.body.appendChild에 대한 필요 없음 ... 내 답변 참조 stackoverflow.com/a/45905238/236062
Zibri

13

다음은 Firefox 및 Chrome에서 테스트했지만 Internet Explorer에서는 작동하지 않는 순수한 JavaScript 솔루션입니다.

function downloadDataUrlFromJavascript(filename, dataUrl) {

    // Construct the 'a' element
    var link = document.createElement("a");
    link.download = filename;
    link.target = "_blank";

    // Construct the URI
    link.href = dataUrl;
    document.body.appendChild(link);
    link.click();

    // Cleanup the DOM
    document.body.removeChild(link);
    delete link;
}

지금까지 발견 된 크로스 브라우저 솔루션 :

downloadify-> Flash 필요

databounce-> IE 10 및 11에서 테스트되었으며 나를 위해 작동하지 않습니다. 서블릿과 일부 사용자 정의가 필요합니다. (네비게이터를 잘못 감지합니다. 테스트를 위해 IE를 호환성 모드로 설정하고, 서블릿의 기본 문자 집합, 절대 경로에 대한 올바른 서블릿 경로가있는 JavaScript 옵션 개체 ...) IE가 아닌 브라우저의 경우 동일한 창에서 파일을 엽니 다.

download.js-> http://danml.com/download.html 유사하지만 테스트되지 않은 다른 라이브러리입니다. 서블릿이나 플래시가 필요하지 않은 순수한 JavaScript라고 주장하지만 IE <= 9에서는 작동하지 않습니다.


download.js는 꽤 좋습니다. IE11에 대한 빠른 확인을 수행했습니다. 감사합니다!
Ricky Jiao

12

몇 가지 솔루션이 있지만 HTML5에 의존하며 일부 브라우저에서는 아직 완전히 구현되지 않았습니다. 아래 예제는 Chrome 및 Firefox에서 테스트되었습니다 (일부 작동).

  1. 파일에 저장이 지원되는 캔버스 예제 . document.location.href데이터 URI로 설정하십시오 .
  2. 앵커 다운로드 예 . <a href="your-data-uri" download="filename.txt">파일 이름을 지정 하는 데 사용합니다.

3
캔버스 예제는 404로 이어집니다
Karel Bílek

크롬 및 모바일 사파리의 pdf 데이터 URL에 대한 다운로드 속성이 저에게 효과적입니다.
bbsimonbb

7

@owencm 및 @ Chazt3n의 답변을 결합하여이 기능을 사용하면 IE11, Firefox 및 Chrome에서 텍스트를 다운로드 할 수 있습니다. (죄송합니다. Safari 또는 Opera에 액세스 할 수 없습니다. 시도해 보시면 작동하면 댓글을 추가해주세요.)

initiate_user_download = function(file_name, mime_type, text) {
    // Anything but IE works here
    if (undefined === window.navigator.msSaveOrOpenBlob) {
        var e = document.createElement('a');
        var href = 'data:' + mime_type + ';charset=utf-8,' + encodeURIComponent(text);
        e.setAttribute('href', href);
        e.setAttribute('download', file_name);
        document.body.appendChild(e);
        e.click();
        document.body.removeChild(e);
    }
    // IE-specific code
    else {
        var charCodeArr = new Array(text.length);
        for (var i = 0; i < text.length; ++i) {
            var charCode = text.charCodeAt(i);
            charCodeArr[i] = charCode;
        }
        var blob = new Blob([new Uint8Array(charCodeArr)], {type: mime_type});
        window.navigator.msSaveOrOpenBlob(blob, file_name);
    }
}

// Example:
initiate_user_download('data.csv', 'text/csv', 'Sample,Data,Here\n1,2,3\n');

1

IE에 문제가있는 사람 :

Yetti의 답변에 찬성 투표하십시오 : IE에서 로컬로 캔버스 저장

dataURItoBlob = function(dataURI) {
    var binary = atob(dataURI.split(',')[1]);
    var array = [];
    for(var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }
    return new Blob([new Uint8Array(array)], {type: 'image/png'});
}

var blob = dataURItoBlob(uri);
window.navigator.msSaveOrOpenBlob(blob, "my-image.png");

0

당신의 문제는 본질적으로 "모든 브라우저가 이것을 지원하지는 않을 것"으로 귀결됩니다.

해결 방법을 시도하고 Flash 개체에서 압축을 푼 파일을 제공 할 수 있지만 JS 전용 순도를 잃게됩니다 (어쨌든 현재 Flash 해결 방법없이 "파일을 브라우저로 드래그"할 수 있는지 확실하지 않습니다. -HTML5 기능일까요?)

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