添加依赖
<!--FTP包-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.5</version>
</dependency>
书写代码
package com.yqjr.treasury.plan.busi.utils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import javax.swing.*;
import java.io.*;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
/**
* @author 86138
*/
public class FtpStaticUtils {
private static String ftpHost = ""; //ip
private static int port =21; //默认端口号21
private static String userName = "root"; //登录名
private static String passWord = ""; //密码
private static String ftpEncode = "GBK";
private static int defaultTimeout =3000;
/**
* ftp上传文件
* @throws IOException
* @throws SocketException
*/
public static boolean uploadFile(String path, //上传ftp的路径
InputStream is, //用流读取文件
String fileNewName //文件名
) throws SocketException, IOException {
boolean flag = true;
//is = new FileInputStream(localFile);
// 保存至Ftp
FTPClient ftpClient = createFtpClient();// ftpHost为FTP服务器的IP地址,port为FTP服务器的登陆端口,ftpHost为String型,port为int型。
ftpClient.setBufferSize(1024 * 1024);// 设置缓存区,默认缓冲区大小是1024,也就是1K
List<String> list = getPathList(path);
for(int i=0; i<list.size(); i++){
if(!ftpClient.changeWorkingDirectory(list.get(i))){//若路径未存在则创建路径
if(!ftpClient.makeDirectory(list.get(i))){//若路径创建失败则不再继续处理
System.out.println("create dir fail --> " + list.get(i));
//close(ftpClient);
}
}
}
// 上传至Ftp
ftpClient.changeWorkingDirectory(path);
flag = ftpClient.storeFile(fileNewName, is);
is.close();
// 关闭连接
ftpClient.logout();
ftpClient.disconnect();
return flag;
}
//分割路径
private static List<String> getPathList(String path){
String[] dirs = path.split("/");
List<String> list = new ArrayList<>();
String pathname = "";
for(String str : dirs){
if(StringUtils.isEmpty(str)){
continue;
}
pathname = pathname + "/" + str;
list.add(pathname);
}
return list;
}
/**
* 创建ftp链接
* @throws IOException
* @throws SocketException
*/
public static FTPClient createFtpClient() throws SocketException, IOException {
FTPClient ftpClient = new FTPClient();// ftpHost为FTP服务器的IP地址,port为FTP服务器的登陆端口,ftpHost为String型,port为int型。
ftpClient.setControlEncoding(ftpEncode); // 中文支持
ftpClient.connect(ftpHost);
ftpClient.login(userName, passWord);// userName、passWord分别为FTP服务器的登陆用户名和密码
ftpClient.setDefaultPort(port);
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode(); // 用被动模式传输,解决linux服务长时间等待,导致超时问题
ftpClient.setDefaultTimeout(defaultTimeout);// 设置默认超时时间
return ftpClient;
}
/**
* 关闭ftp
*/
public static void closeFtpClient(FTPClient ftpClient) throws IOException{
ftpClient.logout();
ftpClient.disconnect();
}
/**
* 创建文件夹
*/
public static boolean addFoder(String path, String foderName) throws SocketException, IOException {
boolean flag = true;
// 保存至Ftp
FTPClient ftpClient = createFtpClient();// ftpHost为FTP服务器的IP地址,port为FTP服务器的登陆端口,ftpHost为String型,port为int型。
// 切换目录,目录不存在创建目录
//ftpClient.changeWorkingDirectory(path);
flag = ftpClient.makeDirectory(path + "/" +foderName);
// 关闭连接
closeFtpClient(ftpClient);
return flag;
}
}
注意事项
1. 创建连接
ftpClient.connect(hostname, port);
2. 检查上传的工作目录是否存在--不存在并创建
ftpClient.changeWorkingDirectory(workingPath)
3. 上传文件
ftpClient.storeFile(saveName, fileInputStream)
4. 断开连接
ftpClient.disconnect()
建议:
在SpringBoot项目中不要像我这种傻子写静态的工具类 可以通过
@Component
@ConfigurationProperties(prefix = "ftp")
这两个注解写一个配置类 通过注入的方式调用 ,端口什么的值可以在配置文件中配置,方便修改,不说了,给去改代码了.