java如何解压页面上传到服务器的zip文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何解压页面上传到服务器的zip文件相关的知识,希望对你有一定的参考价值。

我是通过Form中FormFile类型的对象取得上传的zip文件,如何将zip文件中的子文件解压到服务器的某一路径下?
public void importShuoMingShu(FormFile file) throws BaseException
// 读取文件流,转成excel对象,分析对象,存入数据
try
InputStream stream = file.getInputStream();
BufferedInputStream origin = new BufferedInputStream(stream, 2048);
ZipInputStream zout = new ZipInputStream(origin);
ZipEntry zipEntry = null;
//循环遍历zip中的每一个文件进行处理
while( ( zipEntry = zout.getNextEntry() ) != null )
//如果是文件夹,不做处理
if(zipEntry.isDirectory())
continue;

//取得文件名
String xlsName = zipEntry.getName().trim();
//取得当前该文件流
File xlsFile = new File("c://" + xlsName);
OutputStream outputS = new FileOutputStream(xlsFile);
ZipFile zf = (ZipFile)file;
InputStream inputS = zf.getInputStream(zipEntry);
byte[] by = new byte[100000];
int c;
while ((c = inputS.read(by)) != -1)
outputS.write(by, 0, c);

outputS.flush();
outputS.close();

以上是我的代码 不过在ZipFile zf = (ZipFile)file;处出现了强制转型异常,请高手帮忙看看该如何解决这个问题。谢谢

直接通过工具类进行解压或者压缩文件即可。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
*
* @author gdb
*/
public class ZipUtilAll
public static final int DEFAULT_BUFSIZE = 1024 * 16;

/**
* 解压Zip文件
*
* @param srcZipFile
* @param destDir
* @throws IOException
*/
public static void unZip(File srcZipFile, String destDir) throws IOException

ZipFile zipFile = new ZipFile(srcZipFile);
unZip(zipFile, destDir);


/**
* 解压Zip文件
*
* @param srcZipFile
* @param destDir
* @throws IOException
*/
public static void unZip(String srcZipFile, String destDir) throws IOException

ZipFile zipFile = new ZipFile(srcZipFile);
unZip(zipFile, destDir);


/**
* 解压Zip文件
*
* @param zipFile
* @param destDir
* @throws IOException
*/
public static void unZip(ZipFile zipFile, String destDir) throws IOException

Enumeration<? extends ZipEntry> entryEnum = zipFile.entries();
ZipEntry entry = null;
while (entryEnum.hasMoreElements())
entry = entryEnum.nextElement();
File destFile = new File(destDir + entry.getName());
if (entry.isDirectory())
destFile.mkdirs();

else
destFile.getParentFile().mkdirs();
InputStream eis = zipFile.getInputStream(entry);
System.out.println(eis.read());
write(eis, destFile);




/**
* 将输入流中的数据写到指定文件
*
* @param inputStream
* @param destFile
*/
public static void write(InputStream inputStream, File destFile) throws IOException

BufferedInputStream bufIs = null;
BufferedOutputStream bufOs = null;
try
bufIs = new BufferedInputStream(inputStream);
bufOs = new BufferedOutputStream(new FileOutputStream(destFile));
byte[] buf = new byte[DEFAULT_BUFSIZE];
int len = 0;
while ((len = bufIs.read(buf, 0, buf.length)) > 0)
bufOs.write(buf, 0, len);

catch (IOException ex)
throw ex;
finally
close(bufOs, bufIs);



/**
* 安全关闭多个流
*
* @param streams
*/
public static void close(Closeable... streams)

try
for (Closeable s : streams)
if (s != null)
s.close();

catch (IOException ioe)
ioe.printStackTrace(System.err);



/**
* @param args
* @throws java.lang.Exception
*/
public static void main(String[] args) throws Exception

// unZip(new File(ZipDemo.class.getResource("D:/123/HKRT-B2B.zip").toURI()), "D:/123/");
unZip("D:/123/123.zip", "D:/123/");
// new File();

参考技术A 你这里写错了。 这是以前我写的解zip和压缩zip的
private void zip(String zipFileName, File inputFile) throws Exception
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
zip(out, inputFile, "");
System.out.println("zip done");
out.close();


private void zip(ZipOutputStream out, File f, String base) throws Exception
if (f.isDirectory())
File[] fl = f.listFiles();
out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));
base = base.length() == 0 ? "" : base + "/";
for (int i = 0; i < fl.length; i++)
zip(out, fl[i], base + fl[i].getName());

else
out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));
FileInputStream in = new FileInputStream(f);
int b;
System.out.println(base);
while ( (b = in.read()) != -1)
out.write(b);

in.close();

参考技术B 这个转换肯定是会出错的,struts 的formFile跟zipFile没有直接关系,怎么能这么强制转化呢?
建议
1. 把文件保存到一个临时目录(保存为zip文件)
2. 读取这个文件
3. 抽取想要的文件
4. 把临时文件删除本回答被提问者采纳

centos下如何解压rar分卷?

我在windows7下用winrar软件把一些文件压缩成一百多个后缀为.rar的分卷,然后上传到centos服务器上,请问如何把这些后缀为.rar的分卷解压到当前目录下。本人是linux盲,希望高手朋友能写个详细的命令给我。我的压缩文件是d.part001.rar,在edenw目录下。谢谢了!

在liunx下原本是不支持rar文件的,需要安装liunx下的winrar版本,操作如下
http://www.rarsoft.com/download.htm 下载页面

wget http://www.rarsoft.com/rar/rarlinux-4.0.1.tar.gz
tar -zxvf rarlinux-4.0.1.tar.gz
cd rar
make

看见下面这些信息就是安装成功了
mkdir -p /usr/local/bin
mkdir -p /usr/local/lib
cp rar unrar /usr/local/bin
cp rarfiles.lst /etc
cp default.sfx /usr/local/lib

但是在运行命令rar时,出现下面这个问题,
rar: /lib/i686/nosegneg/libc.so.6: version `GLIBC_2.7\' not found (required by rar)
解决办法:
cp rar_static /usr/local/bin/rar
先记住两个常用命令吧:
rar x yhcsh.rar //解压 yhcsh.rar 到当前目录
rar yhcsh.rar ./yhcsh/ //将 yhcsh 目录打包为 yhcsh.rar
参考技术A archive mounter是最好用的,你直接双击rar文件,再打开文件浏览器,就可以看到rar文件已挂载到左侧的位置下面了,再点击,把里面的文件复制到随便什么位置就可以算解压了。
还有一种方法,就是安装unrar ,rar,
sudo yum install rar unrar,
再解压

以上是关于java如何解压页面上传到服务器的zip文件的主要内容,如果未能解决你的问题,请参考以下文章

升级tomcat需要更改哪些配置?

从 FTP 服务器上的 Zip 解压 csv 文件

linux如何打CVE-2018-2628漏洞补丁?补丁文件名称为p27342434_122130_Generic.zip . 解压后有27342434文

上传ZIP文件并在服务器上解压的脚本

centos下如何解压rar分卷?

百度云朋友快传给我的三个文件后缀分别是zip z01 z02 求如何解压?详细点!谢谢!