实现通过java操作命令行压缩文件
This commit is contained in:
8
pom.xml
8
pom.xml
@@ -99,6 +99,14 @@
|
||||
<version>1.3.3</version>
|
||||
</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>
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取目录下所有文件的路径
|
||||
*
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
port_num: 8080
|
||||
filePath: F:\JAVA Workspace\Temp\
|
||||
remoteproperties:
|
||||
ip: 192.168.79.138
|
||||
user: root
|
||||
password: 27894869
|
||||
path: /home/ftp/cms/
|
||||
spring:
|
||||
thymeleaf:
|
||||
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