主体代码:
package com.datacopy.myjava;
import com.datacopy.mapper.FtpserverMapper;
import com.datacopy.model.Ftpserver;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.Date;
import java.util.List;
@Service
public class FileReading {
private static Logger logger = Logger.getLogger(FileReading.class);
/** 本地字符编码 */
private static String LOCAL_CHARSET = "GBK";
// FTP协议里面,规定文件名编码为iso-8859-1
private static String SERVER_CHARSET = "ISO-8859-1";
@Autowired
private FtpserverMapper ftpserverMapper;
private Ftpserver ftpdata(){
Ftpserver f=new Ftpserver();
f.setStatus((short)3);
Ftpserver ftpserver=ftpserverMapper.selectOne(f);
return ftpserver;
}
public static String readConfigfileForFTP() throws SocketException, IOException {
// Ftpserver f=ftpdata();
Ftpserver f=new Ftpserver();
f.setHost("192.168.31.252");
f.setPassword("1");
f.setUsername("syftp");
f.setPort((short)21);
String ftphost =f.getHost();
int ftpport =f.getPort();
String ftpusername = f.getUsername();
String ftppassword = f.getPassword();
String ftphostbf="192.168.31.196";
int ftpportbf=21;
String ftpusernamebf="will";
String ftppasswordbf="soft";
String ftpath="/201994";
String ftpname="ftpwill";
//ftp根目录的下一级目录
String localFile="1234";
File fD=new File("E:\\ftp\\"+localFile);
if(!fD.isDirectory()){
fD.mkdirs();
}
FTPClient ftpOne = new FTPClient();
FTPClient ftpTwo = new FTPClient();
//连接FTPOne
ftpOne.connect(ftphost, ftpport);
boolean isloginOne = ftpOne.login(ftpusername, ftppassword);
if (!FTPReply.isPositiveCompletion(ftpOne.getReplyCode())) {
logger.info("连接失败,用户名或密码错误");
} else {
logger.info("FTP连接成功");
}
//连接FTPTwo
ftpTwo.connect(ftphostbf, ftpportbf);
boolean isloginTwo = ftpTwo.login(ftpusernamebf, ftppasswordbf);
if (!FTPReply.isPositiveCompletion(ftpOne.getReplyCode())) {
logger.info("连接失败,用户名或密码错误");
} else {
logger.info("备份FTP连接成功");
}
if (isloginOne && isloginTwo) {
ftpOne.enterLocalPassiveMode();
logger.info("获取ftpOne路径" + ftpath + "文件");
// 获取ftpOne目录下的文件
FTPFile[] ftp = ftpOne.listFiles(ftpath);
for (FTPFile file : ftp) {
String st = new String(file.getName().getBytes(), "UTF-8");
logger.info("开始备份" + st + "文书");
if (st.endsWith("jpg")||st.endsWith("JPG")||st.endsWith("jpeg")) {
logger.info(ftpname + "开始时间:"+new Date());
ftpTwo.setRemoteVerificationEnabled(false);
// ftpTwo.setBufferSize(100000); //设置缓冲大小
// 获取ftpTwo输出流
OutputStream is = ftpTwo.storeFileStream(ftpTwo.printWorkingDirectory() + localFile + "/" + file.getName());
if (is == null) {
logger.error("目标文件不存在");
break;
}
ftpOne.changeWorkingDirectory(ftpath);
ftpOne.setFileType(FTP.BINARY_FILE_TYPE);
// 通过流把FTPOne复制到FTPTwo
ftpOne.retrieveFile(file.getName(), is);
logger.info(st + "备份完成");
is.close();
// 检查返回值是否成功
ftpTwo.completePendingCommand();
logger.info(ftpname + "结束时间:"+new Date());
}
}
}
ftpOne.logout();
if (ftpOne.isConnected()) {
ftpOne.disconnect();
}
if (ftpTwo.isConnected()) {
ftpTwo.disconnect();
} else {
logger.error("ftp路径错误");
}
return "数据全部已完成";
}
public static void main(String[] args) {
try {
String t=FileReading.readConfigfileForFTP();
} catch (IOException e) {
System.err.println(e.getMessage()+" : "+e.getClass().getName());
}
}
}
乱码参考代码
/** 本地字符编码 */
private static String LOCAL_CHARSET = "GBK";
// FTP协议里面,规定文件名编码为iso-8859-1
private static String SERVER_CHARSET = "ISO-8859-1";
private void connectFtpServer() {
if (ftpClient == null) {
ftpClient = new FTPClient();
}
if (ftpClient.isConnected()) {
return;
}
String host = getConfigValue(ADDRESS);
int port = Integer.valueOf(getConfigValue(PORT));
String user = getConfigValue(USER);
String password = getConfigValue(PASSWORD);
try {
ftpClient.connect(host, port);
if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
if (ftpClient.login(user, password)) {
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(
"OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
LOCAL_CHARSET = "UTF-8";
}
ftpClient.setControlEncoding(LOCAL_CHARSET);
ftpClient.enterLocalPassiveMode();// 设置被动模式
ftpClient.setFileType(getTransforModule());// 设置传输的模式
return;
} else {
throw new FileStorageException(
"Connet ftpServer error! Please check user or password");
}
}
} catch (IOException e) {
disConnectServer();
throw new FileStorageException(
"Connet ftpServer error! Please check the Configuration");
}
}
上传文件时,文件名称需要做编码转换
fileName = new String(fileName.getBytes(LOCAL_CHARSET),
SERVER_CHARSET);
来源:https://blog.csdn.net/weixin_44873668/article/details/102776263