实现通过java操作命令行压缩文件
This commit is contained in:
8
pom.xml
8
pom.xml
@@ -99,6 +99,14 @@
|
|||||||
<version>1.3.3</version>
|
<version>1.3.3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>3.7</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ import com.fjy.spring.domain.TbLog;
|
|||||||
import com.fjy.spring.domain.TbUser;
|
import com.fjy.spring.domain.TbUser;
|
||||||
import com.fjy.spring.enums.ResultEnum;
|
import com.fjy.spring.enums.ResultEnum;
|
||||||
import com.fjy.spring.exception.UserException;
|
import com.fjy.spring.exception.UserException;
|
||||||
|
import com.fjy.spring.properties.RemoteExecuteProperties;
|
||||||
import com.fjy.spring.properties.ServerProperties;
|
import com.fjy.spring.properties.ServerProperties;
|
||||||
import com.fjy.spring.service.FileService;
|
import com.fjy.spring.service.FileService;
|
||||||
import com.fjy.spring.service.LogService;
|
import com.fjy.spring.service.LogService;
|
||||||
import com.fjy.spring.untils.FtpOperationUtil;
|
import com.fjy.spring.untils.FtpOperationUtil;
|
||||||
import com.fjy.spring.untils.FtpUtils;
|
import com.fjy.spring.untils.FtpUtils;
|
||||||
import com.fjy.spring.untils.LogUtil;
|
import com.fjy.spring.untils.LogUtil;
|
||||||
|
import com.fjy.spring.untils.RemoteExecuteCommandUtil;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.net.ftp.FTPClient;
|
import org.apache.commons.net.ftp.FTPClient;
|
||||||
import org.apache.commons.net.ftp.FTPFile;
|
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;
|
import static com.fjy.spring.constant.GlobalConstant.USER_SESSION_KEY;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
|
@Slf4j
|
||||||
public class DownLoadController {
|
public class DownLoadController {
|
||||||
/**
|
/**
|
||||||
* 服务器配置信息
|
* 服务器配置信息
|
||||||
@@ -42,6 +45,9 @@ public class DownLoadController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ServerProperties serverProperties;
|
private ServerProperties serverProperties;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RemoteExecuteProperties remoteExecuteProperties;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private FileService fileService;
|
private FileService fileService;
|
||||||
|
|
||||||
@@ -220,7 +226,6 @@ public class DownLoadController {
|
|||||||
* @param folder
|
* @param folder
|
||||||
* @param response
|
* @param response
|
||||||
*/
|
*/
|
||||||
@GetMapping("/home/admin/download/downloadzip")
|
|
||||||
public void batDownload(@RequestParam(value = "courseName") String courseName,
|
public void batDownload(@RequestParam(value = "courseName") String courseName,
|
||||||
@RequestParam(value = "Folder") String folder, HttpServletResponse response) {
|
@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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取目录下所有文件的路径
|
* 获取目录下所有文件的路径
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -177,14 +177,6 @@ public class UpLoadController {
|
|||||||
uploadUrl = serverProperties.getFilePath() + "upload/";
|
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()) {
|
for (MultipartFile file : files.values()) {
|
||||||
|
|
||||||
Homework homework = new Homework();
|
Homework homework = new Homework();
|
||||||
@@ -213,31 +205,6 @@ public class UpLoadController {
|
|||||||
|
|
||||||
File targetFile = new File(pathname);
|
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("文件上传到: " + uploadUrl + filename);
|
||||||
log.info("文件大小: " + FormatFileSizeUtil.GetFileSize(file.getSize()));
|
log.info("文件大小: " + FormatFileSizeUtil.GetFileSize(file.getSize()));
|
||||||
log.info("文件名: " + filename);
|
log.info("文件名: " + filename);
|
||||||
@@ -309,16 +276,6 @@ public class UpLoadController {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
file.transferTo(targetFile);
|
|
||||||
fileList.add(
|
|
||||||
request.getScheme() + "://" + request.getServerName() + ":"
|
|
||||||
+ serverProperties.getPortNum() + request.getContextPath() + "/upload/"
|
|
||||||
+ file.getOriginalFilename());
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -539,7 +539,7 @@ public class FtpOperationUtil {
|
|||||||
path = new String(path.getBytes("UTF-8"), "iso-8859-1");
|
path = new String(path.getBytes("UTF-8"), "iso-8859-1");
|
||||||
if (path != null && path.length() != 0) {
|
if (path != null && path.length() != 0) {
|
||||||
boolean flagChange = ftpClient.changeWorkingDirectory(path);
|
boolean flagChange = ftpClient.changeWorkingDirectory(path);
|
||||||
System.out.println("【目录切换】" + flagChange);
|
System.out.println("【目录切换】" + path + flagChange);
|
||||||
}
|
}
|
||||||
return ftpClient.retrieveFileStream(sourceFileName);
|
return ftpClient.retrieveFileStream(sourceFileName);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,11 @@ server:
|
|||||||
serverproperties:
|
serverproperties:
|
||||||
port_num: 8080
|
port_num: 8080
|
||||||
filePath: F:\JAVA Workspace\Temp\
|
filePath: F:\JAVA Workspace\Temp\
|
||||||
|
remoteproperties:
|
||||||
|
ip: 192.168.79.138
|
||||||
|
user: root
|
||||||
|
password: 27894869
|
||||||
|
path: /home/ftp/cms/
|
||||||
spring:
|
spring:
|
||||||
thymeleaf:
|
thymeleaf:
|
||||||
prefix: classpath:/templates/
|
prefix: classpath:/templates/
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
package com.fjy.spring.untils;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class RemoteExecuteCommandUtilTest {
|
||||||
|
|
||||||
|
RemoteExecuteCommandUtil rec=new RemoteExecuteCommandUtil("192.168.79.138", "root","27894869");
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void login() {
|
||||||
|
rec.login();
|
||||||
|
System.out.println(rec.execute("ifconfig"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void execute() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void executeZip() {
|
||||||
|
rec.login();
|
||||||
|
System.out.println(rec.execute("zip -r /home/ftp/cms/upload/信息安全时间测试.zip /home/ftp/cms/upload/信息安全"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void executeSuccess() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setCharset() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getConn() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setConn() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getIp() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setIp() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getUserName() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setUserName() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getUserPwd() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setUserPwd() {
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user