如何使用JSZip将zip文件保存到win8应用程序中的本地存储?

时间:2013-08-07 14:10:16

标签: windows-8 local-storage winjs jszip

我可以在我的代码中创建JSZip对象,但是我无法将其保存到我的Windows 8应用程序中的本地存储。我能够找到的示例设置浏览器的location.href来触发下载,这对我来说不是一个真正的选择。

我在下面提供了我的代码。我最终得到的zip文件无效,无法打开。任何帮助将不胜感激。

供参考:JSZip

        function _zipTest() {
        var dbFile = null;
        var zipData = null;
        Windows.Storage.StorageFile.getFileFromPathAsync(config.db.path)
            .then(function (file) {
                dbFile = file;
                return Windows.Storage.FileIO.readBufferAsync(file);
            })
            .then(function (buffer) {
                //Read the database file into a byte array and create a new zip file
                zipData = new Uint8Array(buffer.length);
                var dataReader = Windows.Storage.Streams.DataReader.fromBuffer(buffer);
                dataReader.readBytes(zipData);
                dataReader.close();

                var localFolder = Windows.Storage.ApplicationData.current.localFolder;
                return localFolder.createFileAsync(dbFile.displayName.concat('.zip'), Windows.Storage.CreationCollisionOption.replaceExisting)
            })
            .then(function (file) {
                //Write the zip data to the new zip file
                var zip = new JSZip();
                zip.file(dbFile.displayName, zipData);
                var content = zip.generate();

                return Windows.Storage.FileIO.writeTextAsync(file, content);
            });
    }

1 个答案:

答案 0 :(得分:2)

你可以在这些方面做点什么。此代码似乎在临时文件夹中生成有效的.zip文件。

    var zip = new JSZip();
    var storage = Windows.Storage;
    storage.StorageFile.getFileFromApplicationUriAsync(new Windows.Foundation.Uri('ms-appx:///images/logo.png')).then(function ongetfile(file)
    {
        var blob = MSApp.createFileFromStorageFile(file);
        var url = URL.createObjectURL(blob, { oneTimeOnly: true });
        return WinJS.xhr({ url: url, responseType: 'arraybuffer' });
    }).then(function onreadbuffer(req)
    {
        var b = req.response;
        zip.file('logo.png', b);
        return storage.ApplicationData.current.temporaryFolder.createFileAsync('a.zip', storage.CreationCollisionOption.replaceExisting);
    }).then(function onnewfile(out)
    {
        var content = zip.generate({ type: 'uint8array' });
        return storage.FileIO.writeBytesAsync(out, content);
    }).then(null, function onerror(error)
    {
        // TODO: error handling
    });