布丁的博客

好吃的技术宅∧ ∧

NthsKeys – 解压跑起来

| 0 comments

现在解压归类的活交给后端,提交用户也不可控了,想想就有些小激动呢。

解压交给 p7zip,它支持解压市面上多数压缩格式。学校发的答案也就 rar 和 zip,p7zip 完全符合要求。Node 方面开一个子进程就解决了,当然封装 Promise 是必须的。

顺便说一下,Ubuntu 要正常解压 rar 需要 p7zip-full 和 p7zip-rar 这两个包,否则会出现 Unsupported Method  错误。

解压成功后,得到的文件都在临时目录中,移动到文件目录时进行归类即可。代码比较乱就不贴了。移动完再递归遍历所有文件,读出信息并存入数据库。为了避免重复,我们用 mongoose 的 findOneAndUpdate 函数,并设置 upsert 字段,覆盖掉 path 相同的项:

最后清除临时目录,完成!

不要高兴太早,上线就出问题了…路径乱码!第一份答案压缩包格式是 zip,猜测管理员直接用了 Windows 的“发送到” – “压缩(zipped)文件夹”功能,然而 Windows 的编码到了类 Unix 系统上都有不少坑。关于详细的分析和解决方案,请移步某位学长 Recursive G 博客的这篇文章。在此感谢他的无私奉献。应用到 Node 里面只要开两个子进程调用 convmv 就可以了,方法和前面类似。

问:如果不需要处理乱码呢?即路径已经是 UTF-8 编码?
答:若路径全是西文字母,转了相当于没转。当然这种情况几乎不可能出现。而 ISO-8859-1 编码只有拉丁字符集,尝试把 UTF-8 中文编码回去的话,convmv 会报错: iso-8859-1 doesn't cover all needed characters for: "/path/to/the/文件" 并在最后良心提示 To prevent damage to your files, we won't continue. ,此时只需跳过下一步重编码即可。

convmv 本身是 Perl 脚本,运行之前得确保 Perl 解释器存在。用 Alpine 做 Docker 基础镜像的时候被这个坑了一把。

这样一来,后端就只剩些粗活了,下一篇继续。


来玩 Ingress?

anyShare分享到:

发表评论

Required fields are marked *.