搭建看这个文章
传送阵
添加 maven
<!--ftp 工具-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
**连接信息我写在配置文件了,根据自己的情况写 **
ftp:
port: 21
ip: 192.168.100.10
username: Administrat
password: 1qazwsx-
增 删 改 查 下载 工具类
import com.ruoyi.common.core.constant.Constants;
import org.apache.commons.net.ftp.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
@Component
public class FtpUtils {
@Value("${ftp.ip}")
private String ip;
@Value("${ftp.port}")
private String port;
@Value("${ftp.username}")
private String username;
@Value("${ftp.password}")
private String password;
/**
* 连接 ftp
*
* @return
*/
public FTPClient initFtpClient() {
Integer reply;
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(ip, Integer.parseInt(port)); //连接Ftp服务器
ftpClient.login(username, password); //登陆Ftp服务器
ftpClient.setControlEncoding("utf-8");//设置编码类型
reply = ftpClient.getReplyCode(); //获取返回码,用于判断是否连接成功
if (!FTPReply.isPositiveCompletion(reply)) {
System.err.println("服务器连接失败");
return null;
} else {
ftpClient.enterLocalPassiveMode(); //设置被动模式
ftpClient.setControlEncoding("utf-8");//设置字符模式,解决中文乱码问题
}
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
dropFtpClient(ftpClient);
}
return ftpClient;
}
/**
* 关闭
*/
public void dropFtpClient(FTPClient ftpClient) {
try {
ftpClient.logout(); //退出登陆
if (ftpClient.isConnected()) {//检测是否连接Ftp服务器
ftpClient.disconnect(); //关闭连接
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 上传文件
*
* @param pathname ftp服务保存地址
* @param inputStream 待上传文件的名称(绝对地址) *
* @return
*/
public boolean uploadFiles(FTPClient ftpClient, String pathname, InputStream inputStream, String fileName) {
boolean is_success = false;
try {
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
String pathname_new = new String(pathname.getBytes("GBK"), "iso-8859-1");
createDirs(ftpClient, pathname_new);
ftpClient.changeWorkingDirectory(pathname_new); //跳转到指定的Ftp文件目录(相对路径)
String localFileName = new String(fileName.getBytes("GBK"), "iso-8859-1");
is_success = ftpClient.storeFile(localFileName, inputStream);//上传文件
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
dropFtpClient(ftpClient);
}
return is_success;
}
/**
* 上传文件
* @param pathname ftp服务保存地址
* @param originfilename 待上传文件的名称(绝对地址) *
* @return
*/
public boolean uploadFiles(FTPClient ftpClient, String pathname, String originfilename) {
boolean is_success = false;
InputStream inputStream = null;
try {
File localFile = new File(originfilename);
inputStream = new FileInputStream(localFile);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
String pathname_new = new String(pathname.getBytes("GBK"), "iso-8859-1");
createDirs(ftpClient, pathname_new);
ftpClient.changeWorkingDirectory(pathname_new); //跳转到指定的Ftp文件目录(相对路径)
String localFileName = new String(localFile.getName().getBytes("GBK"), "iso-8859-1");
is_success = ftpClient.storeFile(localFileName, inputStream);//上传文件
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}finally {
dropFtpClient(ftpClient);
}
return is_success;
}
/**
* 下载文件
*
* @param pathName ftp服务器文件目录
* @param localPath 下载后的文件路径 *
* @return
*/
public static boolean downloadFile(FTPClient ftpClient, String pathName, String localPath) {
boolean is_success = false;
OutputStream os = null;
try {
ftpClient.changeWorkingDirectory(pathName);//跳转到指定的Ftp文件目录
FTPFile[] ftpFiles = ftpClient.listFiles();//获取目录下所有的文件和文件夹
//遍历目录下所有的文件
for (FTPFile file : ftpFiles) {
if (file.isFile()) {
File localFile = new File(localPath + "/" + file.getName());
os = new FileOutputStream(localFile);
ftpClient.retrieveFile(file.getName(), os);//下载文件到本地
os.close();
} else if (file.isDirectory()) {
downloadFile(ftpClient, pathName + file.getName() + "/", localPath);
}
}
is_success = true;
} catch (Exception e) {
e.printStackTrace();
}
return is_success;
}
/**
* 功能:根据文件名称,下载文件流
*
* @param filename 地址与文件名
* @return
* @throws IOException
*/
public void download(String filename, HttpServletResponse response) {
// 获取文件名称
String[] strs = filename.split("/");
String downloadFile = strs[strs.length - 1];
try {
// 设置文件ContentType类型,这样设置,会自动判断下载文件类型
response.setContentType("application/x-msdownload");
// 设置文件头:最后一个参数是设置下载的文件名并编码为UTF-8
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(downloadFile, "UTF-8"));
// 建立连接
FTPClient ftpClient = initFtpClient();
// 此句代码适用Linux的FTP服务器
String newPath = new String(filename.getBytes("GBK"), "ISO-8859-1");
// ftp文件获取文件
InputStream is = null;
BufferedInputStream bis = null;
try {
is = ftpClient.retrieveFileStream(newPath);
bis = new BufferedInputStream(is);
OutputStream out = response.getOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len = bis.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
dropFtpClient(ftpClient);
close(bis);
close(is);
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 关流的
*
* @param closeable
*/
public void close(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 删除文件
*
* @param pathName ftp服务器文件目录
* @param fileName 删除的文件名
* @param type 0:表示文件夹,1:标识文件
* @return
*/
public boolean deleteFile(FTPClient ftpClient, String pathName, String fileName, String type) {
boolean is_success = false;
try {
String pathNmae_new = new String(pathName.getBytes("GBK"), "iso-8859-1");
String fileName_new = new String(fileName.getBytes("GBK"), "iso-8859-1");
ftpClient.changeWorkingDirectory(pathNmae_new);
if (Constants.ZERO.equals(type)) {
/*删除文件夹*/
is_success = ftpClient.removeDirectory(fileName_new);
} else {
//删除文件
is_success = ftpClient.deleteFile(fileName_new);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
dropFtpClient(ftpClient);
}
return is_success;
}
/**
* 创建多级目录
*
* @param ftp 一个连接有效的ftp连接
* @param path 可能需要创建的多级目录路径,/分隔
*/
public void createDirs(FTPClient ftp, String path) {
/*该部分为逐级创建*/
String[] split = path.split("/");
try {
for (String str : split) {
if (StringUtils.isBlank(str)) {
continue;
}
if (!ftp.changeWorkingDirectory(str)) {
ftp.makeDirectory(str);
ftp.changeWorkingDirectory(str);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}