//1、备份(加密)
package com.koalii.eseal.backup.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.bouncycastle.util.encoders.Base64;
import com.koalii.core.struts.action.BaseAction;
import com.koalii.eseal.admin.dto.AdminDTO;
import com.koalii.eseal.backup.struts.form.BackUpForm;
import com.koalii.eseal.log.util.LogUtil;
import com.koalii.eseal.util.KeyUtil;
import com.koalii.eseal.util.ParameterConstant;
import com.koalii.eseal.util.ZipUtil;
import com.koalii.quickstart.util.AppConstant;
/**
* BackUpAction.java
*
* @CopyRight KOAL Co. Lmt 2009
* @author zhengxd
* @Since
* @version
* @Date: 2009-7-8
*/
public class BackUpAction extends BaseAction{
protected Object actionExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
ZipUtil zip = new ZipUtil();
BackUpForm backForm = (BackUpForm)form;
String filePath = request.getRealPath("/")+ParameterConstant.FILE_PATH;//ParameterConstant.FILE_PATH=“koalii”
String zipPath = filePath+".zip";
zip.zip(zipPath, filePath);
//获得登陆用户信息
String pass = String.valueOf(backForm.getPassWord());
//加密密码 返回固定的28位长度的数组
byte bytepass [] = new String(Base64.encode( KeyUtil.keyStorePassDgtByte(pass.getBytes()))).getBytes();
// 读取文件流
javax.servlet.ServletOutputStream out = response.getOutputStream();
java.io.FileInputStream fileInputStream = new java.io.FileInputStream(
zipPath);
// 下载文件
// 设置响应头和下载保存的文件名
String filename = "koalii.zip";
if (filename != null && filename.length() > 0) {
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename="
+ new String(filename.getBytes("utf-8"),
"iso8859-1") + "");
if (fileInputStream != null) {
int filelen = fileInputStream.available();
// 文件太大时内存不能一次读出,要循环
//创建新数组,用于存储密码流+文件流
byte a[] = new byte[filelen+bytepass.length];
//arraycopy(被复制的数组, 从第几个元素开始复制, 要复制到的数组, 从第几个元素开始粘贴, 一共需要复制的元素个数);
System.arraycopy(bytepass, 0, a, 0, bytepass.length);
fileInputStream.read(a,bytepass.length,filelen);
byte enbyte []=Base64.encode(a);
out.write(enbyte);
}
fileInputStream.close();
out.close();
}
return null;
}
}
//2、恢复(解密)
package com.koalii.eseal.recover.struts.action;
import java.io.FileOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.upload.FormFile;
import org.bouncycastle.util.encoders.Base64;
import com.koalii.core.struts.action.BaseAction;
import com.koalii.eseal.admin.dto.AdminDTO;
import com.koalii.eseal.log.util.LogUtil;
import com.koalii.eseal.recover.struts.form.RecoverForm;
import com.koalii.eseal.util.KeyUtil;
import com.koalii.eseal.util.ParameterConstant;
import com.koalii.eseal.util.ZipUtil;
import com.koalii.quickstart.util.AppConstant;
/**
* RecoverAction.java
*
* @CopyRight KOAL Co. Lmt 2009
* @author zhengxd
* @Since
* @version
* @Date: 2009-7-8
*/
public class RecoverAction extends BaseAction{
protected Object actionExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
ZipUtil zip = new ZipUtil();
RecoverForm reform = (RecoverForm)form;
FormFile file = reform.getFile();
String filePath = request.getRealPath("/")+ParameterConstant.FILE_PATH;
//获得登陆用户信息
AdminDTO user = (AdminDTO) request.getSession().getAttribute(AppConstant.userInSessionKey);
if(null==user){
super.sendMessage(request, "登陆超时,请重新登陆");
return mapping.findForward("loginout");
}
String pass = String.valueOf(reform.getPassWord());
//存储加密文件的所有数据
byte[] all = file.getFileData();
//存储解密后的所有数据
byte[] deall = Base64.decode(all);
//设置密码数组长度
byte[] passb = new byte[28];
//从解密数据中提取出密码并放入密码数组中
System.arraycopy(deall, 0, passb, 0, 28);
//将新输入的密码bsae64加码 因为在备份时 输入的密码已经做过base64加密之后才跟文件流一起做的加密
byte bytepass [] = new String(Base64.encode(KeyUtil.keyStorePassDgtByte(pass.getBytes()))).getBytes();
//判断恢复密码是否正确
if(new String(passb).equals(new String(bytepass)))
{
//将真实的文件内容提取出来并存入数组,因为密码加密后的长度是固定的28位 从第28位以后才是真实文件的内容
byte[] real = new byte[deall.length-28];
System.arraycopy(deall, 28, real, 0, real.length);
FileOutputStream out = new FileOutputStream(filePath+".zip");
//将真实文件写入磁盘
out.write(real);
out.close();
//解压真实文件
zip.unzip(filePath+".zip", filePath);
ActionErrors message = new ActionErrors();
message.add(Globals.ERROR_KEY,new ActionMessage("message", "系统恢复成功,请重新启动服务器!"));
request.getSession().setAttribute(Globals.ERROR_KEY, message);
}else{
ActionErrors message = new ActionErrors();
message.add(Globals.ERROR_KEY,new ActionMessage("message", "恢复密码不正确,请输入备份时填写的密码!"));
request.getSession().setAttribute(Globals.ERROR_KEY, message);
}
return mapping.findForward("success");
}
}
//3、zip基础类
package com.koalii.eseal.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipUtil {
public void zip(String zipFileName, String inputFile) throws Exception {
zip(zipFileName, new File(inputFile));
}
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();
}
public void unzip(String zipFileName, String outputDirectory)
throws Exception {
ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
ZipEntry z;
while ((z = in.getNextEntry()) != null) {
//System.out.println("unziping " + z.getName());
if (z.isDirectory()) {
String name = z.getName();
name = name.substring(0, name.length() - 1);
File f = new File(outputDirectory + File.separator + name);
f.mkdir();
//System.out.println("mkdir " + outputDirectory + File.separator
// + name);
} else {
File f = new File(outputDirectory + File.separator
+ z.getName());
f.createNewFile();
FileOutputStream out = new FileOutputStream(f);
int b;
while ((b = in.read()) != -1)
out.write(b);
out.close();
}
}
in.close();
}
private void zip(ZipOutputStream out, File f, String base) throws Exception {
//System.out.println("Zipping " + f.getName());
if (f.isDirectory()) {
File[] fl = f.listFiles();
out.putNextEntry(new 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 ZipEntry(base));
FileInputStream in = new FileInputStream(f);
int b;
while ((b = in.read()) != -1){
out.write(b);
}
in.close();
}
}
public static void main(String[] args) {
try {
//Process process = Runtime.getRuntime().exec(new String[] { "/bin/csh", "-c","zip -P "+123456+" news.zip "+" E://test" });
ZipUtil t = new ZipUtil();
t.zip("E://test.zip", "E://test");
t.unzip("E://test.zip", "E://test1");
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}