【问题标题】:issue in identifying whether the zip file is password protected using javascript使用 javascript 识别 zip 文件是否受密码保护的问题
【发布时间】:2022-01-18 10:21:21
【问题描述】:

我有一个简单的 Web 应用程序,用于将 zip 文件上传到服务器。在 Javascript 部分中,我使用了 try-catch 块,通过读取条目并捕获相应的错误来检查文件是否受密码保护(预定义且已知的密码)。

我使用的js库是https://github.com/gildas-lormeau/zip.js/blob/master/dist/zip.min.js

let reader;
try {
    reader = new zip.ZipReader(new zip.BlobReader(file), {
        password
    });
    const entries = await reader.getEntries();
    for (const entry of entries) {
        try {
            await entry.getData(new zip.BlobWriter(), {
                onprogress: (index, max) => {
                    zip.BlobWriter.$cancel()
                    reader.close()
                }
            });
        } catch (error) {
            if (error.message === zip.ERR_ENCRYPTED ||
                error.message === zip.ERR_INVALID_PASSWORD) {
                alert("Incorrect password")
                return false;
            } else {
                console.log(error)
            }
        }
    }
} catch (error) {
    console.log(error)
} finally {
    await reader.close();
}

上面的代码成功判断出文件是否没有被预先设定的密码加密。但是,对于某些文件,错误声明如下。 TypeError: Cannot read properties of undefined (reading 'importKey')

我想知道为什么会发生这种情况以及如何知道文件是否受密码保护。

谢谢

【问题讨论】:

  • 使用console.error(error),您应该可以获得更多错误发生位置的信息。不知道错误来自哪里,很难说。

标签: javascript


【解决方案1】:

您提出的代码存在一些问题,例如 BlobWriter.$cancel 没有记录在任何地方,实际上也不存在。此外,您应该只拨打一次reader.close()

下面是如何编写这样的函数。

const verifyZipPassword = async (file, password) => {
    const reader = new zip.ZipReader(new zip.BlobReader(file), { password });
    const entries = await reader.getEntries();
    try {
        for (const entry of entries) {
            const abortController = new AbortController();
            const signal = abortController.signal;
            const onprogress = () => abortController.abort();
            await entry.getData(new zip.BlobWriter(), { signal, onprogress });
        }
    } catch (error) {
        if (error.message == zip.ERR_INVALID_PASSWORD) {
            return false;
        } else if (error.message != zip.ERR_ABORT) {
            throw error;
        }
    } finally {
        await reader.close();
    }
    return true;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多