파일 압축 해제


79

웹 브라우저를 사용하여 클라이언트 측에서 OpenOffice 파일, .odt 및 .odp 를 표시하고 싶습니다 .

이러한 파일은 압축 파일입니다. Ajax를 사용하면 서버에서 이러한 파일을 가져올 수 있지만 압축 된 파일입니다. JavaScript를 사용하여 압축을 풀어야 하는데 inflate.js, http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt를 사용해 보았지만 성공하지 못했습니다.

어떻게 할 수 있습니까?


7
"성공하지 않음"좀 더 구체적으로 설명하고, 코드를 보여주고, 오류를 보여주세요. 우리는 추측이 아니라 도움을 드리기 위해 여기에 있습니다.
OcuS

기본적으로 방금 inflate 함수를 호출했습니다.-data = zip_inflate (src); 그러나 이것은 단일 파일을 의미한다고 생각합니다. zip 파일이 디렉토리 구조에 여러 파일을 포함하는 경우 "데이터"의 내용은 무엇입니까? 이 라이브러리를 사용하는 방법을 모르겠습니다.
user69260

@Eimantas 그것은 무엇을 의미합니까? + 또는 -
user69260

4
@techfandu : (1) 이름을 클릭하십시오. (2) 이전 질문을 클릭하십시오. (3) 가장 도움이 된 대답을 받아들이십시오. (4) 모든 질문에 답이 나올 때까지 반복하십시오.
Dave Jarvis

작업에 성공 했습니까? 나는 학교에서 프로젝트를 위해 똑같은 일을해야한다. (웹 브라우저에서 odp를 재생한다) .. 나에게 몇 가지 포인터를 줄 수 있다면 그것은 끔찍할 것이다.
Alexx

답변:


61

나는 자바 스크립트로 압축을 풀었다. 효과가있다.

그것은에 의존 앤디 GP 나 바이너리 파일 리더notmasteryet 일부 RFC1951 부풀려의 논리 . ZipFile 클래스를 추가했습니다.

작업 예 :
http://cheeso.members.winisp.net/Unzip-Example.htm (데드 링크)

출처 :
http://cheeso.members.winisp.net/srcview.aspx?dir=js-unzip (데드 링크)

주의 : 링크가 끊어졌습니다. 곧 새 호스트를 찾겠습니다.

소스에는 ZipFile.htm 데모 페이지와 3 개의 개별 스크립트 (zipfile 클래스 용, 인플레이 트 클래스 용, 바이너리 파일 판독기 클래스 용)가 포함되어 있습니다. 데모는 또한 jQuery 및 jQuery UI에 의존합니다. js-zip.zip 파일을 다운로드하기 만하면 필요한 모든 소스가 있습니다.


자바 스크립트에서 애플리케이션 코드는 다음과 같습니다.

// In my demo, this gets attached to a click event.
// it instantiates a ZipFile, and provides a callback that is
// invoked when the zip is read.  This can take a few seconds on a
// large zip file, so it's asynchronous. 
var readFile = function(){
    $("#status").html("<br/>");
    var url= $("#urlToLoad").val();
    var doneReading = function(zip){
        extractEntries(zip);
    };

    var zipFile = new ZipFile(url, doneReading);
};


// this function extracts the entries from an instantiated zip
function extractEntries(zip){
    $('#report').accordion('destroy');

    // clear
    $("#report").html('');

    var extractCb = function(id) {
        // this callback is invoked with the entry name, and entry text
        // in my demo, the text is just injected into an accordion panel.
        return (function(entryName, entryText){
            var content = entryText.replace(new RegExp( "\\n", "g" ), "<br/>");
            $("#"+id).html(content);
            $("#status").append("extract cb, entry(" + entryName + ")  id(" + id + ")<br/>");
            $('#report').accordion('destroy');
            $('#report').accordion({collapsible:true, active:false});
        });
    }

    // for each entry in the zip, extract it. 
    for (var i=0; i<zip.entries.length;  i++) {
        var entry = zip.entries[i];

        var entryInfo = "<h4><a>" + entry.name + "</a></h4>\n<div>";

        // contrive an id for the entry, make it unique
        var randomId = "id-"+ Math.floor((Math.random() * 1000000000));

        entryInfo += "<span class='inputDiv'><h4>Content:</h4><span id='" + randomId +
            "'></span></span></div>\n";

        // insert the info for one entry as the last child within the report div
        $("#report").append(entryInfo);

        // extract asynchronously
        entry.extract(extractCb(randomId));
    }
}

데모는 몇 단계로 작동합니다. readFilefn은 클릭으로 트리거되고 zip 파일을 읽는 ZipFile 객체를 인스턴스화합니다. 읽기가 완료되면 비동기 콜백이 있습니다 (일반적으로 적당한 크기의 zip의 경우 1 초 이내에 발생 함).이 데모에서 콜백은 doneReading 로컬 변수에 보관 extractEntries됩니다. 압축 파일. 실제 앱에서는 추출 할 항목 중 일부를 선택할 수 있습니다 (사용자가 프로그래밍 방식으로 하나 이상의 항목을 선택하거나 선택할 수 있도록 허용).

extractEntriesFN 모든 항목을 반복하고 전화 extract()콜백을 통과하는 각 하나. 항목의 압축 해제는 zip 파일의 각 항목에 대해 1 초 이상 시간이 걸리므로 비동기가 적절하다는 것을 의미합니다. 추출 콜백은 추출 된 콘텐츠를 페이지의 jQuery 아코디언에 추가합니다. 콘텐츠가 바이너리 인 경우 형식이 지정됩니다 (표시되지 않음).


작동하지만 유틸리티가 다소 제한적이라고 생각합니다.

한 가지는 매우 느립니다. PKWare에서 140k AppNote.txt 파일의 압축을 푸는 데 ~ 4 초가 걸립니다. .NET 프로그램에서 .5 초 미만으로 동일한 압축 해제를 수행 할 수 있습니다. 편집 : Javascript ZipFile은 IE9 및 Chrome에서 지금보다 훨씬 빠르게 압축을 풉니 다. 컴파일 된 프로그램보다 여전히 느리지 만 일반적인 브라우저 사용에는 충분히 빠릅니다.

또 다른 경우 : 스트리밍을하지 않습니다. 기본적으로 zip 파일의 전체 내용을 메모리에 넣습니다. "실제"프로그래밍 환경에서는 zip 파일의 메타 데이터 (예 : 항목 당 64 바이트) 만 읽은 다음 원하는대로 다른 데이터를 읽고 압축을 풀 수 있습니다. 내가 아는 한 자바 스크립트에서 이와 같은 IO를 수행하는 방법은 없으므로 유일한 옵션은 전체 zip을 메모리로 읽고 임의 액세스를 수행하는 것입니다. 즉, 대용량 zip 파일에 대해 시스템 메모리에 부당한 요구가 발생합니다. 더 작은 zip 파일의 경우별로 문제가되지 않습니다.

또한 : 우편 번호 암호화, 윈집 암호화, ZIP64처럼 - - 우편 옵션이 많이 나는 unzipper에서 구현하는 귀찮게하지 않았다 있습니다 그것은 "일반적인 경우"zip 파일을 처리하지 않습니다 UTF-8로 인코딩 된 파일 이름을, 그래서 의 위에. ( 편집 -이제 UTF-8로 인코딩 된 파일 이름을 처리합니다). 그러나 ZipFile 클래스는 기본 사항을 처리합니다. 이러한 것 중 일부는 구현하기 어렵지 않습니다. 내가 가진 AES 암호 클래스 자바 스크립트를; 암호화를 지원하기 위해 통합 될 수 있습니다. Zip64를 지원하는 것은 대부분의 Javascript 사용자에게 쓸모가 없을 것입니다. 이는 4GB 이상의 zip 파일을 지원하기위한 것이므로 브라우저에서 압축을 풀 필요가 없습니다.

바이너리 콘텐츠의 압축을 푸는 사례도 테스트하지 않았습니다. 지금은 텍스트의 압축을 풉니 다. 압축 된 바이너리 파일이있는 경우 제대로 처리하려면 ZipFile 클래스를 편집해야합니다. 나는 그것을 깨끗하게하는 방법을 알아 내지 못했다. 이제 바이너리 파일도 수행합니다.


편집 -JS unzip 라이브러리 및 데모를 업데이트했습니다. 이제 텍스트 외에도 이진 파일을 수행합니다. 더 탄력적이고 일반적으로 만들었습니다. 이제 텍스트 파일을 읽을 때 사용할 인코딩을 지정할 수 있습니다. 또한 데모가 확장되었습니다. 특히 브라우저에서 XLSX 파일의 압축을 푸는 것을 보여줍니다.

따라서 유용성과 관심이 제한적이라고 생각하지만 작동합니다. Node.js에서 작동 할 것 같습니다.


이것은 멋져 보이지만 다음과 같은 오류 메시지가 나타납니다.이 zipfile은 ZipFile.js에서 지원하지 않는 UTF8을 사용합니다. 권장 할 수있는 빠른 해결 방법이 있습니까?
Giulio Prisco 2011

@Giulio-좋아, UTF8 인코딩 파일 이름의 디코딩을 지원하도록 ZipFile 클래스를 수정했습니다. 이제 작동합니다.
Cheeso 2011-08-07

대박! JSIO.guessFileType에 KMZ (Binary) 및 KML (XML) 지원을 추가 할 수 있습니까?
Brendan Byrd

1
온라인 데모 중 하나의 이전 버전이 있지만 업데이트를 위해 여기에 왔습니다. @Cheeso 시간이있을 때 업데이트 된 링크에 관심이있을 것입니다.
geocodezip 2013 년

1
@DannyBeckett-좋습니다, 알림과 제안에 감사드립니다. 곧 데모를 어딘가에 게시하겠습니다.
Cheeso

26

zip.js를 사용하고 있는데 매우 유용 할 것 같습니다. 한 번 볼 가치가 있습니다!

예를 들어 Unzip 데모를 확인하십시오 .


나는 zip.js를 사용하는 것과 동일하게 사용하고 있지만 사파리에서는 filereader가 정의되어 있지 않습니다 .pls는 사파리로 작업하는 데 도움이됩니다.
user969275

Safari에 대한 경험이 없습니다. zip.js 개발자에게 문의해야합니다. 프로젝트 페이지 하단에 이메일 주소가 있습니다 : gildas-lormeau.github.com/zip.js . 버그 일 수도 있으므로 알려 주셔서 감사합니다.
Dani bISHOP 2013 년

답장 해 주셔서 감사합니다. 문제를 게시했습니다.
user969275

내부에 zip 형식의 base64 인코딩 JSON 문자열이있는 JSON 파일이 있습니다. 내부 JSON 개체가 필요합니다. Java의 InflatorInputStream은 서버에서 압축을 풀 수 있으므로 실제로는 zip 형식입니다. 그러나 BlobReader를 사용하여 디코딩 된 base64 데이터를 atob ()에서 zip.js로 전달하면 "Error while reading zip file"이 발생합니다. 오류. 시각적으로 atob ()의 출력은 바이너리이므로 BlobReader가 올바른 것처럼 보이지만 어쨌든 TextReader를 시도하면 "파일 형식이 인식되지 않습니다."가 표시됩니다. 어떤 아이디어?
수수께끼

pako를 사용 하여 한 줄의 코드로 내 문제를 해결 했습니다pako.inflate(binaryData, { to: 'string' })
enigment

17

jszip이 매우 유용하다는 것을 알았 습니다. 지금까지 읽기 용으로 만 사용했지만 생성 / 편집 기능도 있습니다.

코드 현명한 것은 다음과 같습니다.

var new_zip = new JSZip();
new_zip.load(file);
new_zip.files["doc.xml"].asText() // this give you the text in the file

내가 알아 차린 한 가지는 파일이 바이너리 스트림 형식 (FileReader ()의 .readAsArrayBuffer를 사용하여 읽음)이어야한다는 것입니다. 그렇지 않으면 손상된 zip 파일이있을 수 있다는 오류가 발생했습니다.

편집 : 2.x에서 3.0.0으로 업그레이드 가이드의 참고 사항 :

load () 메서드와 데이터가있는 생성자 (new JSZip (data))는 loadAsync ()로 대체되었습니다.

감사합니다 user2677034


1
이것은 나를 도왔다. 감사. :)
deekshith

1
이 방법은 JSZip 3.0에서 제거되었습니다. 업그레이드 가이드를 확인하세요.
user2677034

1
고마워요, 사용하기가 매우 쉽기 때문에 놀라운 lib입니다 (이전 답변과 비교할 때)!
Maxim Georgievskiy



2

코드 예제는 작성자 사이트의 . babelfish 를 사용 하여 텍스트를 번역 할 수 있습니다 (일본어에서 영어로).

내가 일본어를 이해하는 한,이 zip 확장 코드는 ZIP 아카이브가 아닌 ZIP 데이터 (스트림)를 디코딩하기위한 것입니다.



0

누군가가 원격 서버에서 호스팅되는 zip 파일에서 이미지 또는 기타 바이너리 파일을 읽는 경우 다음 스 니펫을 사용하여 jszip 라이브러리를 사용하여 zip 객체를 다운로드하고 만들 수 있습니다.

// this function just get the public url of zip file.
let url = await getStorageUrl(path) 
console.log('public url is', url)
//get the zip file to client
axios.get(url, { responseType: 'arraybuffer' }).then((res) => {
  console.log('zip download status ', res.status)
//load contents into jszip and create an object
  jszip.loadAsync(new Blob([res.data], { type: 'application/zip' })).then((zip) => {
    const zipObj = zip
    $.each(zip.files, function (index, zipEntry) {
    console.log('filename', zipEntry.name)
    })
  })

이제 zipObj를 사용하여 파일에 액세스하고 해당 파일에 대한 src URL을 만들 수 있습니다.

var fname = 'myImage.jpg'
zipObj.file(fname).async('blob').then((blob) => {
var blobUrl = URL.createObjectURL(blob)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.