java ftp上传下载

   /**
    * Description: 从FTP服务器下载文件
    * @param url FTP服务器hostname
    * @param port FTP服务器端口
    * @param username FTP登录账号
    * @param password FTP登录密码
    * @param remotePath FTP服务器上的相对路径
    * @param fileName 要下载的文件名
    * @param localPath 下载后保存到本地的路径
    * @return
    */
    public static boolean downFile(String ip, int port,String username, String password, String remotePath,String fileName,String localPath) {
        boolean success = false;
        FTPClient ftpc = new FTPClient();
        try {
        	logger.info("连接ftp----");
            int reply;
            ftpc.connect(ip,port);
            logger.info("--------------连接ftp成功--------------");
            //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftpc.login(username, password);//登录
            reply = ftpc.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpc.disconnect();
                return success;
            }
            //
        	logger.info("登录ftp成功!!!!!!!!!!!!!!");
            ftpc.changeWorkingDirectory(remotePath);//转移到FTP服务器目录
            ftpc.enterLocalPassiveMode(); //设置被动模式
            logger.info("切换路径:"+remotePath);
            FTPFile[] fs = ftpc.listFiles();
            logger.info("文件数量1:"+fs.length);

            for(FTPFile ff:fs){
            	logger.info("文件名称:"+ff.getName());
                if(ff.getName().equals(fileName)){
                    File localFile = new File(localPath+"/"+ff.getName()); 

                    OutputStream is = new FileOutputStream(localFile);
                    ftpc.retrieveFile(ff.getName(), is);
                    is.close();
                    logger.info("下载完毕----");
                }
            } 

            ftpc.logout();
            success = true;
        } catch (IOException e) {
            //e.printStackTrace();
        	logger.error("ftp下载报错", e);
        } finally {
            if (ftpc.isConnected()) {
                try {
                    ftpc.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }

  如上代码,ftp上传下载其实很简单,但是有时候相信有的人很困惑,为什么服务器上的路径是对的,反而上传或者下载文件都是失败的或者获取为空。

这是因为ftp的ip的问题,如果ip没有经过防火墙的路由,我们上传下载,直接不需要设置,因为ftpclient默认为主动模式,客户端主动向服务器端发起申请。

但是如果ip穿过防火墙,经过路由了,这时候我们需要注意了,我们再去使用默认下载或者上传,会发生问题。这时候我们需要使用被动模式了。

enterLocalPassiveMode:设置客户端PASV模式
static int PASSIVE_LOCAL_DATA_CONNECTION_MODE
enterLocalActiveMode:设置客户端PORT模式
static int ACTIVE_LOCAL_DATA_CONNECTION_MODE

FTP传输有两种模式:主动模式(PORT)和被动模式(PASV)

时间: 2024-10-29 19:06:42

java ftp上传下载的相关文章

java ftp 上传下载工具类

1 package com.mohecun.utils; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.OutputStre

Java FTP上传下载的实现

昨天修改了一个接口,看到它涉及FTP的上传与下载,用的是:org.apache.commons.net.ftp.FTPClient,它只支持FTP,不支持SFTP 总结下来如此使用: //创建对象 FTPClient fTPClient=new FTPClient(); //创建连接 fTPClient.connect("192.168.1.11",21); //登陆 fTPClient.login("root", "root"); //设置传输

简单的FTP上传下载(java实现)

/** *阅读前请自己在win7上建立FTP主机 *具体步骤如:http://jingyan.baidu.com/article/574c5219d466c36c8d9dc138.html * 然后将以下FTP,username,password分别改成你的FTP ip地址 用户名 密码即可 * 本例子用了apche的commons-net-3.3.jar以方便FTP的访问 请手动buid -path * 待完成版 刷新按钮 登录 都还没有做 而且上传 下载 完成后都需要重新运行 * 2014-

java做的比较完善的FTP上传下载文件服务器源码

Filename: ftp.java Author: leetsing(elove) Create date: 2004-08-30 Use: connect to FTP server,then upload and download file Modify date: 2004-09-05 add to upload file 2004-09-13 add to download file Copy right: Magisky Media Technology Co.,Ltd. *****

FTP 上传下载工具类

import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketException; import o

高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)

前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上传下载. 这两种感觉都有利弊. 第一种实现了代码复用,但是配置信息全需要写在类中,维护比较复杂. 第二种如果是spring框架,可以通过propertis文件,动态的注入配置信息,但是又不能代码复用. 所以我打算自己实现一个工具类,来把上面的两种优点进行整合.顺便把一些上传过程中一些常见的问题也给解

python之实现ftp上传下载代码(含错误处理)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之实现ftp上传下载代码(含错误处理) #http://www.cnblogs.com/kaituorensheng/p/4480512.html#_label2 import ftplib import socket import os def ftpconnect(ftp_info): try: ftp = ftplib.FTP(ftp_info[0]) except (socket.er

python之模块ftplib(实现ftp上传下载代码)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) from ftplib import FTP def ftpconnect(): ftp_server='ftp.python.org' ftp=FTP() ftp.set_debuglevel(2)#打开调式级别2 ftp.connect(ftp_server,21) ftp.login('',''

python网络编程socket模块实现ftp上传下载

本实验实现ftp上传文件下载文件功能,并具有校验文件完整性,打印进度条功能, 主要练习socket,struct模块. ftp用户文件存放在user.json文件中 user.json文件内容 {"lisi": "abcdef", "hyh": "123456"} ftp客户端脚本ftpclient.py #!/usr/bin/python # --*-- coding: utf-8 --*-- import socket i