1.文件下载增加打包功能;

This commit is contained in:
zhangbb 2019-06-04 09:26:42 +08:00
parent ef126175fb
commit c215c4ace3
5 changed files with 211 additions and 35 deletions

View File

@ -1,5 +1,11 @@
<%@page import="com.tenwa.reckon.copydata.FileCopyToOtherPath"%>
<%@page import="com.tenwa.officetempalte.action.CreateOfficeAction"%>
<%@page import="com.tenwa.officetempalte.exportcallback.impl.ZipUtils"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="java.io.File"%>
<%@page import="java.util.Date"%>
<%@page import="java.util.UUID"%>
<%@page import="jbo.app.tenwa.doc.LC_COPYFILE_LOG"%>
<%@page import="com.amarsoft.are.util.StringFunction"%>
<%@page import="com.amarsoft.are.jbo.JBOFactory"%>
@ -14,14 +20,19 @@
String batchNos = CurPage.getParameter("batchNos");
String userid = CurPage.getParameter("userid");
String sParam = CurPage.getParameter("sParam");
String templateNo = "8c0b32eefcf349e5b5f76d898df0bbbb";
String fileSavePath = CurPage.getParameter("fileSavePath");
//创建临时路径
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String time = sdf.format(new Date());
String uuid=UUID.randomUUID().toString().replaceAll("-", "");
String fileSavePath_temp = fileSavePath+"/"+time+uuid;
FileCopyToOtherPath cp = new FileCopyToOtherPath();
cp.setContractNos(contractNos);
cp.setBatchNos(batchNos);
cp.setUserid(userid);
cp.setFileSavePath_temp(fileSavePath_temp);
CreateOfficeAction coa = new CreateOfficeAction();
JBOTransaction tx = JBOFactory.createJBOTransaction();
@ -36,8 +47,8 @@
String[] contractNoArray = contractNos.split("@");
String[] batchNoArray = batchNos.split("@");
for(int i=0;i<contractNoArray.length;i++){
String fileSavePath = CurPage.getParameter("fileSavePath")+"/"+contractNoArray[i]+"/";
String templateParam = "{\"OBJECTTYPE\":\"租金支付表导出\"@\"CurUserId\":\""+userid+"\"@\"fileSavePath\":\""+fileSavePath+"\"@\"CONTRACT_NO\":\""+contractNoArray[i]+"\"}";
String fileSavePath_xml = fileSavePath_temp+"/"+contractNoArray[i]+"/";
String templateParam = "{\"OBJECTTYPE\":\"租金支付表导出\"@\"CurUserId\":\""+userid+"\"@\"fileSavePath\":\""+fileSavePath_xml+"\"@\"CONTRACT_NO\":\""+contractNoArray[i]+"\"}";
coa.setTemplateNo(templateNo);
coa.setTemplateParam(templateParam);
String result = coa.createOfficeByTemplate(tx);
@ -53,6 +64,13 @@
}
}
}
//压缩
FileOutputStream fos1 = new FileOutputStream(new File(fileSavePath+"/"+time+".zip"));
ZipUtils zdo = new ZipUtils();
zdo.toZip(fileSavePath_temp, fos1, true);
//删除原文件
File f = new File(fileSavePath_temp);
zdo.deleteFile(f);
out.print("SUCCESS");
%><%@ include file="/IncludeEndAJAX.jsp"%>

View File

@ -62,7 +62,11 @@
var contractNos = contractNoArray.join("@");
contractNos.replace(/\s+/g, "");
var batchNos = batchNoArray.join("@");
var fileSavePath = "<%=CurConfig.getConfigure("FileCopyPath")%>"
var fileSavePath = "<%=CurConfig.getConfigure("FileCopyPath")%>";
if(fileSavePath==""||fileSavePath==null){
alert("文件保存路径未配置");
return;
}
var sUrl = "/Tenwa/Core/FlowManager/CopyFileToOther.jsp";
var param = "contractNos="+contractNos+"&batchNos="+batchNos+"&userid="+"<%=userid%>"+"&sParam="+sParam+"&fileSavePath="+fileSavePath;
AsControl.RunJsp(sUrl,param,function(result){

View File

@ -6,22 +6,12 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jbo.app.tenwa.doc.LC_COPYFILE_LOG;
import org.apache.commons.io.FileUtils;
import com.amarsoft.are.jbo.BizObject;
import com.amarsoft.are.jbo.BizObjectManager;
import com.amarsoft.are.jbo.JBOFactory;
import com.amarsoft.are.util.StringFunction;
import com.amarsoft.awe.Configure;
import com.amarsoft.awe.util.Transaction;
import com.tenwa.comm.util.jboutil.DataOperatorUtil;
public class FileCopyToOtherPath {
@ -29,25 +19,8 @@ public class FileCopyToOtherPath {
private String contractNos;
private String batchNos;
private String userid;
private String fileSavePath_temp;
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getContractNo() {
return contractNos;
}
public void setContractNos(String contractNos) {
this.contractNos = contractNos;
}
public String getBatchNos() {
return batchNos;
}
public void setBatchNos(String batchNos) {
this.batchNos = batchNos;
}
public String doCopy(String contractNo,String bacthNo,String type){
Transaction Sqlca = Transaction.createTransaction("als");
//原路径
@ -57,8 +30,7 @@ public class FileCopyToOtherPath {
//目标根目录
String rootPath;
try {
Configure config = Configure.getInstance();
rootPath = config.getConfigure("FileCopyPath");
rootPath = fileSavePath_temp;
String sql = "SELECT O.FULLPATH AS FULLPATH, CONCAT(REPLACE(LCI.CONTRACT_NO,'/','-'), '/','"+type+"','/', REPLACE(LDL.ONE_CLASSIFY,'/','-'), '/' , REPLACE(LDL.DOC_NAME,'/','-'), '/', REPLACE(O.FILENAME,'/','-')) AS TARGET_FILE_PATH FROM LB_DOCATTRIBUTE O"
+" LEFT JOIN LB_DOCLIBRARY LDL ON LDL.ID = O.LIBRARY_ID"
+" LEFT JOIN LB_DOCRELATIVE LDR ON LDL.RELATIVE_ID = LDR.ID"
@ -126,5 +98,29 @@ public class FileCopyToOtherPath {
System.out.println("拷贝失败的合同:"+failNo);
return failNo;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getContractNo() {
return contractNos;
}
public void setContractNos(String contractNos) {
this.contractNos = contractNos;
}
public String getBatchNos() {
return batchNos;
}
public void setBatchNos(String batchNos) {
this.batchNos = batchNos;
}
public String getFileSavePath_temp() {
return fileSavePath_temp;
}
public void setFileSavePath_temp(String fileSavePath_temp) {
this.fileSavePath_temp = fileSavePath_temp;
}
}

View File

@ -0,0 +1,158 @@
package com.tenwa.officetempalte.exportcallback.impl;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipUtils {
private static final int BUFFER_SIZE = 2 * 1024;
/**
* 压缩成ZIP 方法1
* @param srcDir
* 压缩文件夹路径
* @param out
* 压缩文件输出流
* @param KeepDirStructure
* 是否保留原来的目录结构,
* true:保留目录结构;
* false:所有文件跑到压缩包根目录下(注意不保留目录结构可能会出现同名文件,会压缩失败)
* @throws RuntimeException
* 压缩失败会抛出运行时异常
*/
public void toZip(String srcDir, OutputStream out,boolean KeepDirStructure) throws RuntimeException {
long start = System.currentTimeMillis();
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(out);
File sourceFile = new File(srcDir);
compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure);
long end = System.currentTimeMillis();
System.out.println("压缩完成,耗时:" + (end - start) + " ms");
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils", e);
} finally {
if (zos != null) {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 压缩成ZIP 方法2
* @param srcFiles
* 需要压缩的文件列表
* @param out
* 压缩文件输出流
* @throws RuntimeException
* 压缩失败会抛出运行时异常
*/
public void toZip(List<File> srcFiles, OutputStream out) throws RuntimeException {
long start = System.currentTimeMillis();
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(out);
for (File srcFile : srcFiles) {
byte[] buf = new byte[BUFFER_SIZE];
zos.putNextEntry(new ZipEntry(srcFile.getName()));
int len;
FileInputStream in = new FileInputStream(srcFile);
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
}
long end = System.currentTimeMillis();
System.out.println("压缩完成,耗时:" + (end - start) + " ms");
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils", e);
} finally {
if (zos != null) {
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 递归压缩方法
* @param sourceFile
* 源文件
* @param zos
* zip输出流
* @param name
* 压缩后的名称
* @param KeepDirStructure
* 是否保留原来的目录结构,
* true:保留目录结构;
* false:所有文件跑到压缩包根目录下(注意不保留目录结构可能会出现同名文件,会压缩失败)
* @throws Exception
*/
private void compress(File sourceFile, ZipOutputStream zos,String name,boolean KeepDirStructure) throws Exception {
byte[] buf = new byte[BUFFER_SIZE];
if (sourceFile.isFile()) {
// 向zip输出流中添加一个zip实体构造器中name为zip实体的文件的名字
zos.putNextEntry(new ZipEntry(name));
// copy文件到zip输出流中
int len;
FileInputStream in = new FileInputStream(sourceFile);
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
// Complete the entry
zos.closeEntry();
in.close();
} else {
File[] listFiles = sourceFile.listFiles();
if (listFiles == null || listFiles.length == 0) {
// 需要保留原来的文件结构时,需要对空文件夹进行处理
if (KeepDirStructure) {
// 空文件夹的处理
zos.putNextEntry(new ZipEntry(name + "/"));
// 没有文件不需要文件的copy
zos.closeEntry();
}
} else {
for (File file : listFiles) {
// 判断是否需要保留原来的文件结构
if (KeepDirStructure) {
// 注意file.getName()前面需要带上父文件夹的名字加一斜杠,
// 不然最后压缩包中就不能保留原来的文件结构,所有文件都跑到压缩包根目录下了
compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
} else {
compress(file, zos, file.getName(), KeepDirStructure);
}
}
}
}
}
/*
* 递归删除临时文件
*/
public void deleteFile(File f){
File [] b = f.listFiles();//获取包含file对象对应的子目录或者文件
for(int i =0;i<b.length;i++){
if(b[i].isFile()){//判断是否为文件
b[i].delete();//如果是就删除
}else{
deleteFile(b[i]);//否则重新递归到方法中
}
}
f.delete();//最后删除该目录中所有文件后就删除该目录
}
}