1

Web アプリのローカル開発を行っており、クライアント側のいくつかのファイルから zip アーカイブを作成する必要があります。ボタンとダウンロードリンクを備えた非常に単純なテストページがあります。ボタンをクリックすると、XMLHttpRequest を使用して読み込まれた png 画像を含むjszip ライブラリを使用して zip ファイルが生成されます。ダウンロード リンクをクリックすると、アーカイブがダウンロードされ、png 画像ファイルが含まれていますが、png 画像は破損しています。Windowsは私に言います:

「画像ファイルが見つからないか無効であるため、WinZip Viewer は画像を表示できませんでした。画像はスキップされました。」

上位バイトを0xffに固定する「通常の」ソリューションに従ってみましたが、同じ結果が得られます。(これは私の GetZip2() 関数です。)

zip の内容が破損している理由を誰か教えてください。

前もって感謝します

HTML コード:

<html>  
    <head>  
        <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
        <meta content="utf-8" http-equiv="encoding">
        <title>Zip Get Test</title>
        <script  src="ZipTest.js" type='text/javascript'></script>
        <script  src="jszip.js" type='text/javascript'></script>

    </head>
<body>
    <input type="Button" id='btnBlob' value="Get image zip" onclick="GetZip2();">
    <a id="download_link" href="url">Download</a>
</body>

js コード:

function GetZip(){
var filename = "BlueRefresh.png";

var xhr=new XMLHttpRequest();
xhr.open("GET", filename, false);
xhr.overrideMimeType('text/plain; charset=x-user-defined');   
xhr.send();

var data = xhr.responseText;

var zip = new JSZip();
zip.file(filename, data);

//make a blob out of the image string
var blob = zip.generate({type:"blob"});
var myLink = document.getElementById("download_link")
myLink.href = window.URL.createObjectURL(blob);
myLink.download = "Archive.zip";

}

function GetZip2(){
var filename = "BlueRefresh.png";

var xhr=new XMLHttpRequest();
xhr.open("GET", filename, false);
xhr.overrideMimeType('text/plain; charset=x-user-defined');   
xhr.send();

var data = xhr.responseText;

var s2 = "";
for (x = 0; x<data.length; ++x) {
  code = data.charCodeAt(x) & 0xff;
  s2 += String.fromCharCode(code);
}
data = s2;


var zip = new JSZip();
zip.file(filename, data);

//make a blob out of the image string
var blob = zip.generate({type:"blob"});
var myLink = document.getElementById("download_link")
myLink.href = window.URL.createObjectURL(blob);
myLink.download = "Archive.zip";

}
4

1 に答える 1

2

同じ問題がありbinary : truezip.file関数にオプションを追加して修正しました。

zip.file(filename, data, {binary : true});

また、デフォルトで jsZip はSTORE(圧縮なし) を使用するため、追加することもできcompression : "DEFLATE"ます。説明はこちらをご覧ください。http://stuk.github.io/jszip/documentation/api_jszip/file_data.html

zip.file(filename, data, {binary : true, compression : "DEFLATE"});
于 2014-05-03T16:40:45.233 に答える