实现通过java操作命令行压缩文件

This commit is contained in:
2018-05-10 21:39:55 +08:00
parent f56c7ce02a
commit edcff8ef21
8 changed files with 325 additions and 49 deletions

View File

@@ -5,12 +5,14 @@ import com.fjy.spring.domain.TbLog;
import com.fjy.spring.domain.TbUser;
import com.fjy.spring.enums.ResultEnum;
import com.fjy.spring.exception.UserException;
import com.fjy.spring.properties.RemoteExecuteProperties;
import com.fjy.spring.properties.ServerProperties;
import com.fjy.spring.service.FileService;
import com.fjy.spring.service.LogService;
import com.fjy.spring.untils.FtpOperationUtil;
import com.fjy.spring.untils.FtpUtils;
import com.fjy.spring.untils.LogUtil;
import com.fjy.spring.untils.RemoteExecuteCommandUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
@@ -35,6 +37,7 @@ import java.util.zip.ZipOutputStream;
import static com.fjy.spring.constant.GlobalConstant.USER_SESSION_KEY;
@Controller
@Slf4j
public class DownLoadController {
/**
* 服务器配置信息
@@ -42,6 +45,9 @@ public class DownLoadController {
@Autowired
private ServerProperties serverProperties;
@Autowired
private RemoteExecuteProperties remoteExecuteProperties;
@Autowired
private FileService fileService;
@@ -175,9 +181,9 @@ public class DownLoadController {
System.out.println(str);
}
String path = "/upload/" + tbFile.getCourseName() + "/" + tbFile.getWorkFolder() + "/";
System.out.println("【path】"+path);
InputStream inputStream = ftpUtil.downFile(path,tbFile.getColfilename());
System.out.println("【available】"+inputStream.available());
System.out.println("【path】" + path);
InputStream inputStream = ftpUtil.downFile(path, tbFile.getColfilename());
System.out.println("【available】" + inputStream.available());
bis = new BufferedInputStream(inputStream);
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
@@ -220,7 +226,6 @@ public class DownLoadController {
* @param folder
* @param response
*/
@GetMapping("/home/admin/download/downloadzip")
public void batDownload(@RequestParam(value = "courseName") String courseName,
@RequestParam(value = "Folder") String folder, HttpServletResponse response) {
//获取文件夹名称
@@ -328,6 +333,60 @@ public class DownLoadController {
}
}
@GetMapping("/home/admin/download/downloadzip")
public void batFTPDownloadZip(@RequestParam(value = "courseName") String courseName,
@RequestParam(value = "Folder") String folder, HttpServletResponse response) throws IOException {
//获取文件夹名称
String paths = "/upload/" + courseName + "/" + folder;
String zipPath = "/zip/";
List<String> pathList;
pathList = getFileString(paths);
//需要压缩的文件--包括文件地址和文件名
String[] path = pathList.toArray(new String[0]);
// 要生成的压缩文件地址和文件名称
String zipFileName = courseName + folder + ".zip";
String desPath = zipPath + "/" + zipFileName;
//System.out.println("打包文件存储地址:"+desPath);
//远程登录SSH
RemoteExecuteCommandUtil rec = new RemoteExecuteCommandUtil(
remoteExecuteProperties.getIp(),
remoteExecuteProperties.getUser(),
remoteExecuteProperties.getPassword());
rec.login();
//登录FTP
FtpOperationUtil ftpOperationUtil = new FtpOperationUtil();
ftpOperationUtil.connectServer();
if (!ftpOperationUtil.existDirectory(zipPath)) {
ftpOperationUtil.createDirectory(zipPath);
}
String desZipPath = remoteExecuteProperties.getPath() + "zip/";
String cmd = "zip -r " + desZipPath + zipFileName + " " + remoteExecuteProperties.getPath() + "upload/" + courseName + "/" + folder;
System.out.println("【cmd】" + cmd);
if (rec.executeSuccess(cmd).equals("")) {
log.error("【cmd创建压缩文件失败】" + cmd);
}
response.setContentType("application/x-msdownload;");
response.setHeader("Content-disposition", "attachment; filename=" + new String(zipFileName.getBytes("utf-8"), "ISO8859-1"));
InputStream inputStream = ftpOperationUtil.downFile("/zip/",zipFileName);
System.out.println("【available】" + inputStream.available());
//将打包好的文件输出到客户端
BufferedInputStream bis = new BufferedInputStream(inputStream);
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
// 记录下载日志
addVisitLog("下载文件" + desZipPath + zipFileName);
}
/**
* 获取目录下所有文件的路径
*

View File

@@ -177,14 +177,6 @@ public class UpLoadController {
uploadUrl = serverProperties.getFilePath() + "upload/";
}
File dir = new File(uploadUrl);
if (!dir.exists()) {
dir.mkdirs();
}
List<String> fileList = new ArrayList<String>();
for (MultipartFile file : files.values()) {
Homework homework = new Homework();
@@ -213,31 +205,6 @@ public class UpLoadController {
File targetFile = new File(pathname);
/*if (targetFile.exists()) {
String bakpathname;
if (rename) {
bakpathname = uploadUrl + "bak/" + user.getColstudentno() + user.getColrealname() + suffix;
} else {
bakpathname = uploadUrl + "bak/" + filename;
}
log.info("源文件路径:" + pathname);
TbFile file1 = fileService.findByFilepath(pathname);
file1.setColfilepath(bakpathname + "." + dateNowStr2 + ".bak");
file1.setColfilename(file1.getColfilename() + "." + dateNowStr2 + ".bak");
if (fileService.addFile(file1)) {
log.info("重命名文件数据库更新成功");
} else {
log.error("重命名文件数据库更新失败");
}
File mvfile = new File(bakpathname + "." + dateNowStr2 + ".bak");
try {
FileUtils.moveFile(targetFile, mvfile);
log.info("源文件:" + targetFile.getName() + "已重命名为:" + mvfile.getName());
} catch (IOException e) {
e.printStackTrace();
}
}*/
log.info("文件上传到: " + uploadUrl + filename);
log.info("文件大小: " + FormatFileSizeUtil.GetFileSize(file.getSize()));
log.info("文件名: " + filename);
@@ -309,16 +276,6 @@ public class UpLoadController {
} catch (IOException e) {
e.printStackTrace();
}
try {
file.transferTo(targetFile);
fileList.add(
request.getScheme() + "://" + request.getServerName() + ":"
+ serverProperties.getPortNum() + request.getContextPath() + "/upload/"
+ file.getOriginalFilename());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

View File

@@ -0,0 +1,19 @@
package com.fjy.spring.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author F嘉阳
* @date 2018-05-10 12:34
*/
@Data
@ConfigurationProperties(prefix = "remoteproperties")
@Component
public class RemoteExecuteProperties {
private String ip;
private String user;
private String password;
private String path;
}

View File

@@ -534,12 +534,12 @@ public class FtpOperationUtil {
return ftpClient.retrieveFileStream(sourceFileName);
}
public InputStream downFile(String path,String sourceFileName) throws IOException {
public InputStream downFile(String path, String sourceFileName) throws IOException {
sourceFileName = new String(sourceFileName.getBytes("UTF-8"), "iso-8859-1");
path = new String(path.getBytes("UTF-8"), "iso-8859-1");
if (path != null && path.length() != 0) {
boolean flagChange = ftpClient.changeWorkingDirectory(path);
System.out.println("【目录切换】" + flagChange);
System.out.println("【目录切换】" + path + flagChange);
}
return ftpClient.retrieveFileStream(sourceFileName);
}

View File

@@ -0,0 +1,161 @@
package com.fjy.spring.untils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.commons.lang3.StringUtils;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
/**
* @author F嘉阳
* @date 2018-05-10 12:16
*/
public class RemoteExecuteCommandUtil {
//字符编码默认是utf-8
private static String DEFAULTCHART="UTF-8";
private Connection conn;
private String ip;
private String userName;
private String userPwd;
public RemoteExecuteCommandUtil(String ip, String userName, String userPwd) {
this.ip = ip;
this.userName = userName;
this.userPwd = userPwd;
}
public RemoteExecuteCommandUtil() {
}
/**
* 远程登录linux的主机
* @author Ickes
* @since V0.1
* @return
* 登录成功返回true否则返回false
*/
public Boolean login(){
boolean flg=false;
try {
conn = new Connection(ip);
conn.connect();//连接
flg=conn.authenticateWithPassword(userName, userPwd);//认证
} catch (IOException e) {
e.printStackTrace();
}
return flg;
}
/**
* @author Ickes
* 远程执行shll脚本或者命令
* @param cmd
* 即将执行的命令
* @return
* 命令执行完后返回的结果值
* @since V0.1
*/
public String execute(String cmd){
String result="";
try {
if(login()){
Session session= conn.openSession();//打开一个会话
session.execCommand(cmd);//执行命令
result=processStdout(session.getStdout(),DEFAULTCHART);
//如果为得到标准输出为空,说明脚本执行出错了
if(StringUtils.isBlank(result)){
result=processStdout(session.getStderr(),DEFAULTCHART);
}
conn.close();
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* @author Ickes
* 远程执行shll脚本或者命令
* @param cmd
* 即将执行的命令
* @return
* 命令执行成功后返回的结果值如果命令执行失败返回空字符串不是null
* @since V0.1
*/
public String executeSuccess(String cmd){
String result="";
try {
if(login()){
Session session= conn.openSession();//打开一个会话
session.execCommand(cmd);//执行命令
result=processStdout(session.getStdout(),DEFAULTCHART);
conn.close();
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 解析脚本执行返回的结果集
* @author Ickes
* @param in 输入流对象
* @param charset 编码
* @since V0.1
* @return
* 以纯文本的格式返回
*/
private String processStdout(InputStream in, String charset){
InputStream stdout = new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset));
String line=null;
while((line=br.readLine()) != null){
buffer.append(line+"\n");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return buffer.toString();
}
public static void setCharset(String charset) {
DEFAULTCHART = charset;
}
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}