最近有个需求要批量打包下载文件,要把文件按类型放到不同的文件夹,然后把文件夹打包到一起下载。实现此功能我们使用apache-ant-zip.jar包的ZipEntry和ZipOutputStream。
很愉快的在本地windows系统开发验证没有问题,部署到linux测试服务器上也没有问题,但是部署生产服务器后下载zip下来解压是乱码的,这就很奇怪咯?对啊,是很奇怪,在linux测试服务器也验证没有问题啊,于是我们一顿研究,各种尝试,最终发现了问题:我们指定了编码为utf-8或gbk,这是不对啊,会导致在不同环境可能会有错误效果。应该指定动态编码,System.getProperty("sun.jnu.encoding")
核心代码如下:
- private void outputZipFile(String docCategory, String docType, String filePath, String fileName, ZipOutputStream zos) throws IOException, FileNotFoundException {
- ZipEntry ze = null;
- byte[] buf = new byte[2048];
- int readLen = 0;
- // 1.动态压缩一个File到zip中
- // 创建一个ZipEntry,并设置Name和其它的一些属性
- // 压缩包中的路径和文件名称
- ze = new ZipEntry(File.separator + docCategory + File.separator + docType + File.separator + fileName);
- String osName = System.getProperties().getProperty("os.name");
- if (osName.equals("Linux")) {
- log.info("压缩文件的系统环境为linux");
- ze.setUnixMode(644);
- zos.setEncoding(System.getProperty("sun.jnu.encoding"));
- log.info("linux下采购归档压缩文件encoding为:" + zos.getEncoding());
- }
- // 将ZipEntry加到zos中,再写入实际的文件内容
- zos.putNextEntry(ze);
- System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding"));
- InputStream is = new BufferedInputStream(new FileInputStream(filePath));
- // 把数据写入到客户端
- while ((readLen = is.read(buf, 0, buf.length)) != -1) {
- zos.write(buf, 0, readLen);
- }
- is.close();
- }
jar: https://mvnrepository.com/artifact/org.apache.ant/ant
参考:
https://blog.csdn.net/haha1903/article/details/83362934
https://www.iteye.com/blog/jackyin5918-2026286