ftp数据移植

一曲冷凌霜 提交于 2019-12-02 14:41:56

主体代码:

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);


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!