2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

JavaScript에서 파일을 다운로드 폴더에 자동적으로 다운로드 시키는 방법

링크나 버튼을 눌렀을 때 특정 파일을 사용자의 PC 다운로드 폴더에 자동으로 다운로드를 하게끔 만들고 싶을 때 우짤꼬? 방법은 다음과 같다.
  1. 링크태그의 HTML5 download속성을 사용해서 다운로드 파일명을 설정
  2. File API의Blob 을 사용해서 데이터를 작성
  3. window.URL.createObjectURLBlob에서URL을 생성해서 링크에 설정시킴
단, 모든 브라우저에서 작동하는 것은 아니라서 Chrome과 FireFox, Edge와 Opera 는 문제가 없이 동작하지만 IE10/11 인 경우는 window.navigator.msSaveBlob(또는 msSaveOrOpenBlob)을 사용해야 하며, IE9 이하인 경우는 Blob 객체를 사용할 수 없으므로 대응이 안 됨. Safari 인 경우에는 완전히 별도의 처리를 해 줘야 하는데, saveAs 의 polyfill에 있는 FileSaver.js 가 Safari에서 사용가능한 듯..해본 적은 없지만 ㅋㅋ

다운로드 기능 구현 샘플코드
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Download Sample</title>
    </head>
    <body>
        <script type='text/javascript'>
            function handleDownload() {
                var content = 'test';
                var blob = new Blob([ content ], { "type" : "text/plain" });

                if (window.navigator.msSaveBlob) { 
                    window.navigator.msSaveBlob(blob, "test.txt"); 

                    // msSaveOrOpenBlob인 경우에는 파일을 저장하는 게 아니라 열기로
                    window.navigator.msSaveOrOpenBlob(blob, "test.txt"); 
                } else {
                    document.getElementById("download").href = window.URL.createObjectURL(blob);
                }
            }
        </script>
        <a id="download" href="#" download="test.txt" onclick="handleDownload()">ダウンロード</a>
    </body>
</html>

CSV파일을 다운로드 할 때 문제가 하나 있는데...일본어가 포함된 파일인 경우 엑셀에서 안 열리거나 깨지는 경우가 있다. 그럴 땐 BOM 객체를 이용해서 다운로드를 하면 가능하다.

CSV다운로드 샘플 코드 - 일본어 데이터 대응
<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Download Sample</title>
    </head>
    <body>
        <script type='text/javascript'>
            function handleDownload() {
                var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
                var content = 'あいうえお,かきくけこ,さしすせそ';
                var blob = new Blob([ bom, content ], { "type" : "text/csv" });

                if (window.navigator.msSaveBlob) { 
                    window.navigator.msSaveBlob(blob, "test.csv"); 

                    // msSaveOrOpenBlobの場合はファイルを保存せずに開ける
                    window.navigator.msSaveOrOpenBlob(blob, "test.csv"); 
                } else {
                    document.getElementById("download").href = window.URL.createObjectURL(blob);
                }
            }
        </script>
        <a id="download" href="#" download="test.csv" onclick="handleDownload()">ダウンロード</a>
    </body>
</html>

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법