话不多说,记记记
首先是上传
path = new String(path.getBytes("GBK"),"iso-8859-1");//上传路径中文转码
//连接就不贴出来了
if (!ftp.changeWorkingDirectory(defaultBaseDir)){
//注意服务器上的文件路径,如果多/会出现返回为空问题
ftp.changeWorkingDirectory(defaultBaseDir);
}
//视情况加,有时候开被动连接会出现连接超时
//ftpClient.enterLocalPassiveMode();
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
// 设置文件名字的编码格式为iso-8859-1,因为FTP上传的时候默认编码为iso-8859-1,解决文件名字乱码的问题
filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");
//上传文件
if (!ftp.storeFile(filename, input)) {
return result;
}
完整代码,我上传的是流
public static boolean uploadFilesss(String filename, InputStream input) {
boolean result=false;
FTPClient ftp = new FTPClient();
int reply;
try {
//中文路径
//path = new String(path.getBytes("GBK"),"iso-8859-1");
ftp.connect(V2Config.getIp(), V2Config.getPort());
ftp.login(V2Config.getUsername(), V2Config.getPassword());
System.out.println(V2Config.getIp()+" "+V2Config.getPort()+""+V2Config.getUsername()+""+V2Config.getPassword());
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return false;
}
//切换到上传目录
if (!ftp.changeWorkingDirectory(defaultBaseDir))
ftp.changeWorkingDirectory(defaultBaseDir);
//设置上传文件的类型为二进制类型
System.out.println(ftp.printWorkingDirectory());
ftp.setFileType(FTP.BINARY_FILE_TYPE);
// 设置文件名字的编码格式为iso-8859-1,因为FTP上传的时候默认编码为iso-8859-1,解决文件名字乱码的问题
filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");
//上传文件
if (!ftp.storeFile(filename, input)) {
return result;
}
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
return result;
}
然后是下载
还是先路径转码
然后
接着
最终,注意如果设置UTF-8的朋友出现下载文件为0KB的情况,就把编码设置为下面的格式
完整代码
public static void downloadFtpFile(String ftpHost, String ftpUserName,
String ftpPassword, int ftpPort, String ftpPath, String localPath,
String fileName) {
FTPClient ftpClient = new FTPClient();
int reply;
try {
String ftpPath2 = new String(ftpPath.getBytes("GBK"),"iso-8859-1");
ftpClient.connect(V2Config.getIp(), V2Config.getPort());
ftpClient.login(V2Config.getUsername(), V2Config.getPassword());
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return;
}
ftpClient.setControlEncoding("UTF-8"); // 中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
boolean flag1 = ftpClient.changeWorkingDirectory(ftpPath2);
if (!flag1) {
logger.error("没有找到" + ftpPath + "---该路径");
return;
}
File localFile = new File(localPath + File.separatorChar + new String(fileName.getBytes("GBK"),"UTF-8"));
OutputStream os = new FileOutputStream(localFile);
//复制文件流
boolean flag2 = ftpClient.retrieveFile(new String(fileName.getBytes("GBK"),"iso-8859-1"), os);
if (!flag2) {
logger.error("没有找到" + fileName + "---该文件");
localFile.delete();
}
os.close();
ftpClient.logout();
} catch (FileNotFoundException e) {
logger.error("没有找到" + ftpPath + "文件");
e.printStackTrace();
} catch (SocketException e) {
logger.error("连接FTP失败.");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
logger.error("文件读取错误。");
e.printStackTrace();
}
}
这里还有个坑,下载文件时的本地路径一定要注意!!!!!一定要注意!!!!!一定要注意!!!!!
如果你的下载方法和文件名都没有问题,本地目录却没有文件,就检查检查本地路径是否正确
我当时遇到的情况是"C:/xxx/",怎么下载都没有文件,后来多番尝试"C:\\xx\"解决问题
如果这些东西对你有帮助,请给个赞,万分感谢
欢迎大神指点