网上各种资料找了一堆,什么主动调用,被动调用都试过了没用,最后发现是文件名称的问题导致的,需要设置字符集编码
FTP使用用户隔离时,一定要新建localuser文件夹
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
public class Test {
public static void testFtp1() {
// 创建客户端对象
FTPClient ftp = new FTPClient();
InputStream local = null;
try {
// 连接ftp服务器
ftp.connect("192.168.0.12", 21);
// 登录
ftp.login("Ftpyc", "Ftpyc");
// 设置上传路径
String path = "/upload";
// 检查上传路径是否存在 如果不存在返回false
boolean flag = ftp.changeWorkingDirectory(path);
if (!flag) {
// 创建上传的路径 该方法只能创建一级目录,在这里如果/home/ftpuser存在则可创建image
ftp.makeDirectory(path);
}
// 指定上传路径
ftp.changeWorkingDirectory(path);
// 指定上传文件的类型 二进制文件
ftp.setFileType(FTP.BINARY_FILE_TYPE);
// 读取本地文件
File file = new File("C:\\Users\\Administrator\\Desktop\\非空新增字段.txt");
local = new FileInputStream(file);
// 第一个参数是文件名
//ftp.enterLocalPassiveMode();
//在此处设置字符集
ftp.setControlEncoding("GBK");
String name=file.getName();
//需要设置文件名称字符集
boolean flag2=ftp.storeFile(new String(name.getBytes("GBK"),"iso-8859-1"), local);
System.out.println(flag2);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭文件流
local.close();
// 退出
ftp.logout();
// 断开连接
ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
testFtp1();
}
}