java连接FTP相关开发

近期要做连接ftp的代码开发,老的账号密码忘了。所以只能在这里记载记载,谢谢

直接贴代码吧,基本注释写的都挺清晰的

#配置地址路径
public class Constants {


    /**
     * ftp请求ip
     */
//    public static final String FTP_IP = "127.0.0.1";
    public static final String FTP_IP = "103.79.24.30";
    /**
     * .gz
     */
    public static final String GZ = ".gz";

    public static final String FTP_ENCODE="UTF-8";
    /**
     * ftp端口号
     */
    public static final int FTP_PORT = xxx;

    /**
     * 请求路径
     */
    public static final String FTP_REQUEST="FTP/request/";

    /**
     * 返回路径
     */
    public static final String FTP_RESPONSE="FTP/response/";

    /**
     * 返回文件名
     */
    public static final String RESPONSE_GZ="_response.gz";
    /**
     * 导入到本地临时路径
     */
    public static final String LOCAL_PATH="d:/";





}

工具类方法

public class FtpUntil {
    private String ftpIp;
    private int port;
    private String ftpName;
    private String ftpPwd;

    //ftp对象
    private FTPClient ftp;
    private InputStream is = null;
    private OutputStream os = null;
    private FileOutputStream fos = null;
    private FileInputStream fis = null;

    public FtpUntil() {

    }

    public FtpUntil(String ftpIp, int port, String ftpName, String ftpPwd) {
        this.ftpIp = ftpIp;
        this.ftpName = ftpName;
        this.ftpPwd = ftpPwd;
        this.port = port;

    }

    public boolean connect() {
        try {
            ftp = new FTPClient();
            ftp.connect(ftpIp, port);
            System.out.println(ftp.login(ftpName, ftpPwd));
            if (!ftp.login(ftpName, ftpPwd)) {
                return false;
            }
            // 设置被动模式
            ftp.enterLocalPassiveMode();
            //设置以二进制方式传输
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftp.setCharset(Charset.forName("UTF-8"));
            ftp.setControlEncoding("UTF-8");

        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 创建目录
     *
     * @param subfolderName 目录信息
     * @return
     */
    public boolean createDir(String subfolderName) {

        String d = subfolderName;
        try {
            //目录编码,解决中文路径问题
            d = new String(subfolderName.toString().getBytes("GBK"), "iso-8859-1");
            //尝试切入目录
            if (ftp.changeWorkingDirectory(d)) {
                return true;
            }
            String[] arr = subfolderName.split("/");
            StringBuffer sbfDir = new StringBuffer();
            //循环生成子目录
            for (String s : arr) {
                sbfDir.append("/");
                sbfDir.append(s);
                //目录编码,解决中文路径问题
                d = new String(sbfDir.toString().getBytes("GBK"), "iso-8859-1");
                //尝试切入目录
                if (ftp.changeWorkingDirectory(d)) {
                    continue;
                }
                if (!ftp.makeDirectory(d)) {
                    System.out.println("[失败]ftp创建目录:" + sbfDir.toString());
                    return false;
                }
                System.out.println("[成功]创建ftp目录:" + sbfDir.toString());
            }
            //将目录切换至指定路径
            return ftp.changeWorkingDirectory(d);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }


    /**
     * 上传到指定路径
     *
     * @param uploadName 远程文件文件名
     * @param localpath  本地文件路径
     * @return
     */
    public Resp upload(String uploadName, String localpath) {
        try {
            if (!connect()) {
                return fail("", "ftp连接失败");
            }
            if(!(new File(localpath).exists())){
                System.out.println();
                return fail("", "本地路径文件不存在"+localpath);
            }
            OutputStream os = ftp.storeFileStream(uploadName);
            fis = new FileInputStream(new File(localpath));

            byte[] b = new byte[1024];
            int len = 0;
            while ((len = fis.read(b)) != -1) {
                os.write(b, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return fail("", "上传失败"+e);
        } finally {
            this.close();
        }
        return success("");
    }

    /**
     * @param remotepath 远程地址文件路径
     * @param localpath  本地文件路径
     * @return
     */
    public Resp download(String remotepath, String localpath) {

        try {
            if (!connect()) {
                return fail("", "ftp连接失败");
            }

            FTPFile[] files =ftp.listFiles(remotepath);
            if(files==null || files.length==0){
                System.out.println("不存在"+remotepath);
                return fail("", "不存在"+remotepath);
            }
            is = ftp.retrieveFileStream(remotepath);
            fos = new FileOutputStream(new File(localpath));

            byte[] b = new byte[1024];
            int len = 0;
            while ((len = is.read(b)) != -1) {
                fos.write(b, 0, len);
            }

        }catch (NullPointerException e) {
            System.out.println("没有找到" + remotepath + "文件");
            e.printStackTrace();
            return fail("", "没有找到" + remotepath + "文件");
        }  catch (IOException e) {
            e.printStackTrace();
            return fail("", "下载失败"+e);
        } finally {
            this.close();
        }
        return success("");
    }

    public  boolean isExsits(String ftpPath){

        try {
            if (!connect()) {
                return false;
            }
            FTPFile[] files =ftp.listFiles(ftpPath);
            if(files!=null&&files.length>0){
                System.out.println("files size:"+files[0].getSize());
                return true;
            }else {
                return false;
            }
        } catch (Exception e) {
            //重新连接一次,可以么?
            try {
                Thread.sleep(1000);
            } catch (Exception e1) {

            }
            System.out.println("重新连接....");
            ftp = null;
            return isExsits(ftpPath);
            //e.printStackTrace();
        }
    }


    //关闭方法
    private void close() {

        if (ftp.isConnected()) {
            try {
                ftp.disconnect();
            } catch (IOException e) {
            }
        }
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
            }
        }
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
            }
        }
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
            }
        }
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
            }
        }
    }


}

这里一定要注意。因为这里我们的路径是包含文件的后缀的。

具体实现方法

public class FtpService {
    Logger logger = LoggerFactory.getLogger(this.getClass());

    public static void main(String[] args) {
        FtpService ff = new FtpService();
        //导入
        Object oo = ff.importFtp("2019042201", "fec3246cefb94d2592af6c4e9c257164", "888888", "E:\\xxx\\xxx\\xxx\\5W.csv.gz");
        System.out.println("oo的值是:---" + oo + ",当前方法=FtpService.main()");
        //导出
        Object pp = ff.exportFtp("2019042201", "fec3246cefb94d2592af6c4e9c257164", "888888");
        System.out.println("pp的值是:---" + pp + ",当前方法=FtpService.main()");



    }

    /**
     * 导入到ftp指定文件夹
     *
     * @param entId     ftp账户名
     * @param requestId 这就是一个文件的路径,主要是为了识别上传的文件不重复所以才是全局唯一
     * @param filePath  本地文件及路径
     * @param entSecret ftp密码
     * @return
     */
    public Object importFtp(String entId, String entSecret, String requestId, String filePath) {
        try {
            FtpUntil ftp = new FtpUntil(Constants.FTP_IP, Constants.FTP_PORT, entId, entSecret);
            boolean connect = ftp.connect();
            if (!connect) {
                return fail("", "ftp连接失败");
            }
            if (!filePath.endsWith(".gz")) {
                return fail(APIConstants.CODE_FILE_ERROR, "", "请选择.gz文件");
            }
            ftp.createDir(Constants.FTP_REQUEST + entId);
            Resp resp = ftp.upload(Constants.FTP_REQUEST + entId + "/" + requestId + Constants.GZ, filePath);
            return resp;
        } catch (Exception e) {
            logger.error("[FtpService][importFtp] and fail" + e);
            return fail("", "导入失败");
        }


    }

    /**
     * ftp导出到临时路径
     *
     * @param entId     用户名
     * @param requestId 这就是一个文件的路径,主要是为了识别上传的文件不重复所以才是全局唯一
     * @param entSecret 密码
     * @return
     */
    public Object exportFtp(String entId, String entSecret, String requestId) {
        try {
            FtpUntil ftp = new FtpUntil(Constants.FTP_IP, Constants.FTP_PORT, entId, entSecret);
            boolean connect = ftp.connect();
            if (!connect) {
                return fail("", "ftp连接失败");
            }
            Resp resp = ftp.download(Constants.FTP_RESPONSE + entId + "/" + requestId + Constants.RESPONSE_GZ, Constants.LOCAL_PATH + requestId + Constants.RESPONSE_GZ);
            return resp;
        } catch (Exception e) {
            logger.error("[FtpService][exportFtp] and fail" + e);
            return fail("", "下载失败");
        }

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值