2

jszip を使用して zip から .png 画像ファイルを投稿しようとしています。.xml ファイルと .mod ファイルで同じことをしようとすると、同じコードが機能しますが、.png ファイルでは機能しません。

私が使用しているコードは次のとおりです。

JSZip.loadAsync(f) // f is the .zip file in the input field
.then(function(zip) {
    zip.forEach(function (relativePath, zipEntry) {
        zipEntry.async("string").then(function (data) {
            //data is the png image
            var pngfilepath="/serverImagesPath/" + zipEntry.name;
            var blob = dataURLtoBlob(data);
            $.ajax({
              type: "POST",
              url:  pngfilepath,
              data: blob,
              dataType: "binary",
            }).done(function ( ) {
                console.log('put correctly png- ' + pngfilepath);
            }).fail(function ( jqXHR, textStatus, errorThrown ) {
                console.log("err png: " + errorThrown, textStatus);
            });
        });
    });
});


function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}

私が間違っていることは何ですか?

4

1 に答える 1

0

$.ajaxコンテンツを Unicode 文字列として処理しようとします。追加processData: falseこの回答(およびjQueryのドキュメント)を参照してください:

$.ajax({
  type: "POST",
  url:  pngfilepath,
  data: blob,
  processData: false
})

コードを少し単純化することもできます.async().blobをサポートしています:

zipEntry.async("blob").then(function (blob) {
  // ...
  $.ajax({
    type: "POST",
    url:  pngfilepath,
    data: blob,
    contentType: "image/png", // or compute it
    processData: false
  })
  // ...
于 2016-08-29T17:16:19.420 に答える