Android 从 ftp下载图片到本地

本人第一篇博文,记录工作中用到的一些知识,方便自己与他人查阅,菜鸟一枚功力有限,文中如有不当之处还请大神指正。

进入正题,完成本功能需要用到 commons-net-3.0.1.jar包.具体代码如下

一、

FTPUtils 工具类:封装方法 

public class FTPUtils {
    private static final String Tag = null;

    private FTPClient ftpClient = null;
    private static FTPUtils ftpUtilsInstance = null;
    private String FTPUrl;
    private int FTPPort;
    private String UserName;
    private String UserPassword;
    private FTPUtils() {
        ftpClient = new FTPClient();
    }

    /* 得到类对象实例  */
    public static FTPUtils getInstance() {
        if (ftpUtilsInstance == null) {
            ftpUtilsInstance = new FTPUtils();
        }
        return ftpUtilsInstance;
    }

    /*
     * 设置FTP服务器
     * @param FTPUrl        FTP服务器IP地址
     * @param FTPPort       FTP服务器端口号
     * @param UserName      登陆FTP服务器的账号
     * @param UserPassword  登陆FTP服务器的密码
     */
    public boolean initFTPSetting(String FTPUrl,int FTPPort,String UserName,String UserPassword) {
        this.FTPUrl = FTPUrl;
        this.FTPPort= FTPPort;
        this.UserName=UserName;
        this.UserPassword=UserPassword;

        int reply;

        try {
            //1.要连接的FTP服务器的地址、端口
            ftpClient.connect(FTPUrl,FTPPort);

            //2.登陆FTP服务器
            ftpClient.login(UserName, UserPassword);

            //3.看返回值是不是230,如果是,表示登陆成功
            reply = ftpClient.getReplyCode();

            if (!FTPReply.isPositiveCompletion(reply)) {
                //断开连接
                ftpClient.disconnect();
                return false;
            }

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

    /*
     *   上传文件
     *   @param FilePath    要上传文件所在的SDCard的路径
     *   @param FileName    要上传文件的文件名(如:SIM的唯一标识码)
     *   @return  true为成功, false为失败
     */
    public boolean uploadFile(String FilePath,String FileName) {
        //判断FTP是否仍在连接
        if (!ftpClient.isConnected()) {
            if (!initFTPSetting(FTPUrl, FTPPort, UserName, UserPassword)) {
                return false;
            }
        }

        try {
            //1.设置存储路径
            ftpClient.makeDirectory("/ftpdata");
            ftpClient.changeWorkingDirectory("/ftpdata");

            //2.设置上传文件需要的一些基本信息
            ftpClient.setBufferSize(1024);
            ftpClient.setControlEncoding("UTF-8");
            ftpClient.enterLocalPassiveMode();
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            //3.文件上传
            FileInputStream fileInputStream = new FileInputStream(FilePath);
            ftpClient.storeFile(FileName, fileInputStream);

            //4.关闭文件流
            fileInputStream.close();

            //5.退出登录FTP,关闭ftpClient连接
            ftpClient.logout();
            ftpClient.disconnect();

        } catch (IOException e) {
            Log.d(Tag, "UpLoad failed"); //输出错误消息
            e.printStackTrace();
            return false;
        }
        return false;
    }

    /*
     * 下载文件
     * @param FilePath 要存放的文件路径
     * @param FileName 远程FTP服务器上的那个文件的名字
     * @return  true为成功, false为失败
     */
    public boolean downLoadFile(String FilePath,String FileName) {
        //判断FTP是否仍在连接
        if (!ftpClient.isConnected()) {
            if (!initFTPSetting(FTPUrl, FTPPort, UserName, UserPassword)) {
                return false;
            }
        }

        try {

  
            
        //登陆后设置文件类型为二进制否则可能导致乱码文件无法打开
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE); //1.转到指定的下载目录 ftpClient.changeWorkingDirectory("/2018");
//2.列出该目录下的所有文件 FTPFile[] files = ftpClient.listFiles(); //3.遍历所有文件,找到指定的文件 for (FTPFile file : files) { String fileName = file.getName(); if (file.getName().equals(FileName)) { //根据绝对路径初始化文件 File appDir = new File(Environment.getExternalStorageDirectory(), FilePath); if (!appDir.exists()) { appDir.mkdir(); } File myfile = new File(appDir, fileName); //输出流 FileOutputStream outputStream = new FileOutputStream(myfile); //下载文件 ftpClient.retrieveFile(file.getName(), outputStream); //关闭流 outputStream.close(); } } //4.退出登录FTP,关闭ftpClient的连接 ftpClient.logout(); ftpClient.disconnect(); } catch (IOException e) { // TODO: handle exception Log.d(Tag, "DownLoad failed"); e.printStackTrace(); return false; } return true; }}

二、引用上面的方法
public class FtpActivity extends Activity implements View.OnClickListener {

    private Button UpLoad_btn,DownLoad_btn;
    //FTP工具类
    private FTPUtils ftpUtils = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ftp);
        UpLoad_btn = (Button) findViewById(R.id.button_1);
        DownLoad_btn = (Button) findViewById(R.id.button_2);
        //设置控件相应函数
        UpLoad_btn.setOnClickListener(this);
        DownLoad_btn.setOnClickListener(this);
        //搭建环境的API Level必须大于等于9
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        //初始化和FTP服务器交互的类
        InitFTPServerSetting();
    }
    public void InitFTPServerSetting() {
        ftpUtils = FTPUtils.getInstance();
        boolean flag = ftpUtils.initFTPSetting("11.11.11.11", 21, "name", "123456");
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button_1:{
               //上传文件
              ftpUtils.uploadFile("/sdcard/ftpdata/ceshi.mp4", "ceshi.mp4");
            }break;

            case R.id.button_2:{
                //下载文件
                //参数为:要存放的文件路径和远程FTP文件名字
              if (ftpUtils.downLoadFile("ccccc", "eeeeee.jpg")) {

                  Toast.makeText(this,"下载成功",Toast.LENGTH_SHORT).show();
              }else {
                  Toast.makeText(this,"下载失败",Toast.LENGTH_SHORT).show();
              }
            }break;

            default:
                break;
        }
    }

    }

三、注:
服务器地址可不加:
//ftp:开头,本例亲测下载方法可用,上传没用到故 没验证。
 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值