javascript - 使用库 JSZip 提取 ZIp 文件

标签 javascript windows-8 zip winjs unzip

我在 Windows 8 中使用 HTML/JS 工作。我正在尝试提取一个 Zip 文件,该文件是使用 FilePicker 选取的文件。

为了提取 Zip 文件,我使用了这个 page .

在此链接中有一个提取 Zip 文件的函数 unzipAsync

function unzipAsync(filePath, replaceIfExists) {

    var fileCollisionOption = replaceIfExists ?
        storage.CreationCollisionOption.replaceExisting :
        storage.CreationCollisionOption.failIfExists;

    return storage.StorageFile
        .getFileFromPathAsync(filePath)
        .then(getFileAsUint8Array)
        .then(function (zipFileContents) {
            //Create the zip data in memory
            var zip = new JSZip(zipFileContents);

            //Extract files
            var promises = [];
            var lf = storage.ApplicationData.current.localFolder;
            _.each(zip.files, function (zippedFile) {

                //Create new file
                promises.push(lf
                    .createFileAsync(zippedFile.name, fileCollisionOption)
                    .then(function (localStorageFile) {
                        //Copy the zipped file's contents into the local storage file
                        var fileContents = zip.file(zippedFile.name).asUint8Array();
                        return storage.FileIO
                            .writeBytesAsync(localStorageFile, fileContents);
                    })
                );
            });

            return WinJS.Promise.join(promises);
        });
}

在此之前,我将 JSZIP 库添加到项目文件夹中。
帮助我,如何将库集成到我的项目中。这是我的项目 Link

编辑:

function getFileAsUint8Array(file) {
    return storage.FileIO.readBufferAsync(file)
        .then(function (buffer) {
            //Read the file into a byte array
            var fileContents = new Uint8Array(buffer.length);
            var dataReader = storage.Streams.DataReader.fromBuffer(buffer);
            dataReader.readBytes(fileContents);
            dataReader.close();

            return fileContents;
        });
}

现在它正在正常工作,没有错误。但它没有做任何事情,比如提取我的文件。

注意:

- 如果有人知道比这个或其他我可以用来为 WinJS 提取文件的库更好的方法;请建议我。

最佳答案

好吧,我猜您还没有创建 getFileAsUint8Array 函数(或者至少,您没有在上面显示它)。我正在做类似的事情(尽管改为从 XHR 调用获取 zip 文件)。一旦我有了 zip 文件和我想要将 zip 文件放入的文件夹,我就会执行类似下面的代码的操作。

但是请注意,我必须在执行其他一些操作时修改此代码,因此我没有完全按原样对其进行测试(显然它不会在您上面的代码中运行)。

这是(大部分)完整代码:

WinJS.xhr({ "url": zipUrl, "responseType": "arraybuffer" })
    .done(
        function (e) {
            if (!e.getResponseHeader("content-type") === "application/zip") {
                console.error("Remote file was not sent with correct Content-Type: expected 'application/zip', but received '" + e.getResponseHeader("content-type") + "'");
            }

            unzipAndStore(new JSZip(e.response), someLocalFolder);
        },
        function() { /* handle ajax errors */ }
    );

/**
 * @param {JSZip} jszipobj The JSZip object
 * @param {StorageFolder} localFolder The folder to unzip into
 * @return {Promise}
 */
var unzipAndStore = function (jszipobj, localFolder) {
    var promises = [];

    Object.keys(jszipobj.files).forEach(function (key) {
        var fileName;

        // ignore folder entries, they're handled as needed below
        if (/\/$/.test(key)) { return; }

        fileName = jszipobj.files[key].name.match(/[^\/]+\.[^\.\/]+$/);
        if (!fileName) {
            console.error("Unable to process zip entry without proper filename: ", jszipobj.files[key].name);
            return;
        }
        fileName = fileName[0];

        promises.push(
            getFolderFromPathRecursive(jszipobj.files[key].name, localFolder)
                .then(
                    function (subFolder) {
                        console.log("creating file in folder: ", fileName, subFolder.name);

                        return subFolder.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.replaceExisting)
                    }
                )
                .then(
                    function (localStorageFile) {
                        return Windows.Storage.FileIO
                            .writeBytesAsync(localStorageFile, jszipobj.file(jszipobj.files[key].name).asUint8Array());
                    }
                )
        );

    });

    return WinJS.Promise.join(promises);
};

/**
 * Promise completes with the lowest level folder in the given path, 
 * creating subfolders along the way
 * @param {String} path The path to the lowest subfolder you want a reference to
 * @param {StorageFolder} rootFolder The folder to begin at for this iteration
 * @return {Promise}
 */
var getFolderFromPathRecursive = function (path, rootFolder) {
    var normalizedPath = path.replace(/\/?[^\/]+\.[^\.\/]+$/, ""),  // remove a possible filename from the end of the path
        folders = normalizedPath.split(/\//), // get an array of the folders in the path
        subFolderName = folders.shift(); // remove the first folder in the path as the new one to create

    return new WinJS.Promise(function (complete, error) {
        if (!subFolderName || !subFolderName.length) {
            complete(rootFolder);
            return;
        }

        rootFolder
            .createFolderAsync(subFolderName, Windows.Storage.CreationCollisionOption.openIfExists)
                .then(
                    function (folder) {
                        return getFolderFromPathRecursive(folders.join("/"), folder);
                    },
                    error
                )
                .then(
                    function(folder) {
                        complete(folder);
                        return;
                    },
                    error
                )
    });
};

关于javascript - 使用库 JSZip 提取 ZIp 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20546131/

相关文章:

xaml - 将 ScrollViewer 从 ViewModel 绑定(bind)到 View

html - WinJS 模板 <p> 未呈现

unix - 修改 zip 文件 md5 哈希值的最快方法

javascript - 下拉语义-UI : Keep the button value by change event

javascript - 在 iPad 上,如何在不显示选项的情况下通过 Javascript 事件在选择元素上设置 focus()?

c# - 仅当应用程序被激活时才会弹出 Toast 通知

Java ObjectOutputStream 未写入 ZipEntry

java - 无需在 java 中解压缩即可读取 Zip 文件内容

Javascript 添加两位小数

javascript - 当排序很重要时,使用 for..in 迭代 JavaScript 对象属性和数组