UWP Сохранение zip-файла на диск

У меня есть приложение UWP, написанное на HTML/Javascript, и у меня возникли проблемы с сохранением zip-файла, созданного из JSZip. В частности, запись на диск - это то, на чем я зациклился.

Я вижу в документах Microsoft, что есть WriteBufferAsync, WriteBytesAsync, WriteLinesAsync и WriteTextAsync. Я не уверен, какой из них мне нужен для этого. Также JSZip может генерировать различные типы, такие как base64, binarystring, uint8array, arraybuffer и blob. Я просто не уверен, какая комбинация мне нужна, чтобы записать этот zip-файл на диск пользователя.

Ниже мой код:

savePNGButton.addEventListener('click', function (e) {
  var zip = new JSZip();
  if (WatermarkText === ""){
    ZipFolder = zip.folder("ImageFolder");
  } else {
    ZipFolder = zip.folder(WatermarkText);
  }
  $(".WatermarkPhoto").each(function(index) {
   imgsrc = this.src;
   var DataURL = imgsrc.replace('data:image/png;base64,', '');
   ZipFolder.file(WatermarkText + index + ".png", DataURL, { base64: true });

  });
  zip.generateAsync({ type:"blob"})
      .then(function (content) {
          console.log(content);
          var savePicker = new Windows.Storage.Pickers.FileSavePicker();
          savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary;
          savePicker.fileTypeChoices.insert("ZIP archive", [".zip"]);
          savePicker.suggestedFileName = WatermarkText+".zip";
          savePicker.pickSaveFileAsync().then(function (file) {
              if (file) {
                  Windows.Storage.CachedFileManager.deferUpdates(file);
                  Windows.Storage.FileIO.writeTextAsync(file, content).done(function () {
                      Windows.Storage.CachedFileManager.completeUpdatesAsync(file).done(function (updateStatus) {
                          if (updateStatus === Windows.Storage.Provider.FileUpdateStatus.complete) {
                              console.log("File " + file.name + " was saved.");
                          } else {
                              console.log("File " + file.name + " couldn't be saved.");
                          }
                      });
                  });
              } else {
                  console.log("Operation cancelled.");
              }
          });
      });
});

person Ian MacLean    schedule 05.08.2017    source источник
comment
Я просто не уверен, какая комбинация мне нужна, чтобы записать этот zip-файл на диск пользователя. Требование относится только к компьютерам, на которых используется ОС *indows 10, да?   -  person guest271314    schedule 05.08.2017
comment
Да. Это всего лишь приложение для Windows 10, которое я пытаюсь загрузить в магазин приложений Windows.   -  person Ian MacLean    schedule 05.08.2017


Ответы (1)


Если кто-то столкнется с этим, я нашел эту ссылку, которая отправила меня в правильном направлении https://blog.appliedis.com/2013/09/18/zipping-and-unzipping-files-in-a-winjs-application/ я использовал uint8array из JSZip вместе с потоковой передачей файлов и WriteBytesAsync из класса Windows FileIO. Ниже приведен последний блок кода, который я использовал для архивирования и отображения диалогового окна сохранения файла.

savePNGButton.addEventListener('click', function (e) {
  var zip = new JSZip();
  if (WatermarkText === ""){
    ZipFolder = zip.folder("Images");
  } else {
    ZipFolder = zip.folder(WatermarkText);
  }
  $(".WatermarkPhoto").each(function(index) {
   imgsrc = this.src;
   var DataURL = imgsrc.replace('data:image/png;base64,', '');
   ZipFolder.file(WatermarkText + index + ".png", DataURL, { base64: true });

  });

  zip.generateAsync({ type: "uint8array", streamFiles:"true"})
      .then(function (content) {
          console.log(content);
              var savePicker = new Windows.Storage.Pickers.FileSavePicker();
              savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary;
              savePicker.fileTypeChoices.insert("ZIP archive", [".zip"]);
              savePicker.suggestedFileName = WatermarkText + ".zip";
              savePicker.pickSaveFileAsync().then(function (file) {
                  if (file) {
                      Windows.Storage.CachedFileManager.deferUpdates(file);
                      Windows.Storage.FileIO.writeBytesAsync(file, content).done(function () {
                          Windows.Storage.CachedFileManager.completeUpdatesAsync(file).done(function (updateStatus) {
                              if (updateStatus === Windows.Storage.Provider.FileUpdateStatus.complete) {
                                  console.log("File " + file.name + " was saved.");
                              } else {
                                  console.log("File " + file.name + " couldn't be saved.");
                              }
                          });
                      });
                  } else {
                      console.log("Operation cancelled.");
                  }
              });
      });
});
person Ian MacLean    schedule 07.08.2017