개발자의 끄적끄적

[javascript] Javascript 기반의 압축 라이브러리, jszip [펌] 본문

개발/javascript & jquery

[javascript] Javascript 기반의 압축 라이브러리, jszip [펌]

효벨 2020. 2. 20. 02:00
728x90
반응형

[javascript] Javascript 기반의 압축 라이브러리, jszip [펌]

 

웹에서는 로컬에 저장된 여러 개의 파일을 사용하기 위해서는 사용자가 해당 파일들을 모두 마우스를 통한 직접적인 선택 행위가 적용되어야 보안상에 문제가 발생하지 않습니다. 이에 대한 대안은 여러개의 파일을 하나의 파일로 묶아 압축하고 압축된 파일 하나에만 이러한 사용자의 선택 행위가 적용되도록 하는 것입니다. 물론 네트워크를 통한 파일의 접근에는 이러한 문제가 발생하지 않습니다.

여튼, 여러 개의 파일이 하나로 묶인, 하나의 압축 파일로써 zip을 처리할 수 있는 자바스크립트 기반의 라이브러리가 몇가지 되는데.. 그중 제가 사용한 라이브러리를 소개합니다. 바로 jszip인데요. 아래의 해맑고 환하게 웃는 인상좋은 개발자의 github에 방문해 다운로드 받을 수 있습니다.

jszip 라이브러리 이외에도 이를 좀더 쉽게 사용하기 위해서 jszip-utils 라이브러리도 함께 받았는데, 위의 그림에서 이 2개의 라이브러리에 대한 다운로드는 파랑색 외곽선 박스로 언급해 두었습니다.

사용코드는 아래와 같습니다. 만약 자바스크립트의 promise라는 개념을 이해하고 있다면 매우 심플하고 직관적이라는 것을 알 수 있습니다. IO 처리이므로 당연이 비동기방식으로 처리됩니다. 과거 버전에서는 동기 방식도 지원했던거 같은데, 제거된 것 같습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<script src="../scripts/extern/jszip/jszip.min.js"></script>

<script src="../scripts/extern/jszip/jszip-utils.min.js"></script>

 

<script>

    let zip_url = 'http://localhost/a.zip';

    let promise = new JSZip.external.Promise(function (resolve, reject) {

        JSZipUtils.getBinaryContent(zip_url, function(err, data) {

            if (err) {

                reject(err);

            } else {

                resolve(data);

            }

        });

    });

 

    promise.then(JSZip.loadAsync).then(

        function (zip) {

            zip.forEach(function (fileName) {

                let file = zip.file(fileName);

 

                // 압축 파일 안에 저장된 파일이 압축이 풀리고 ArrayBuffer 타입으로 전달됨

                file.async("arraybuffer").then(

                    function success(buf) {

                        alert(fileName);

                    },

                    function error(e) {

                        // 에러가 나셨습니다.

                    }

                );

 

            });

        }

    );

</script>

위의 코드에서는 압축 파일 안에 저장된 하나 하나의 파일에 순차적으로 접근해서 압축을 풀고, 풀어진 데이터를 ArrayBuffer 타입으로 전달받도록 21번 째 코드가 file.async(“arraybuffer”)라고 지정되어 있으나, arraybuffer 대신 string, blob로도 지정하여 각각 텍스트, BLOB 타입으로도 전달받을 수 있습니다.

현대의 웹은 무한한 접근성이라는 장점은 있으나 여전이 데스크탑 환경에 비해 처리 속도가 느리지만, 이런 문제점 조차도 웹어셈블리 등의 다양한 기술을 통해 극복해 나가고 있습니다. 향후 몇년안에 모든 프로그램은 서비스화될 것이라고 생각되고, 프로그램의 서비스화에는 JavaScript라는 핵심적인 언어가 중추적인 역할을 할 것입니다

 

 

출처 : http://www.gisdeveloper.co.kr/?p=8936.

반응형
Comments