android 上传数据到FTP注意点

Android进行FTP数据上传时,需依赖Apache的commons-net-3.0.1 jar包。FTP操作不应在主线程中执行,而应在Service中通过多线程实现,以防出现运行时错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android FTP数据上传

  1. FTP上传是需要依赖Apache公司的jar包的,jar包下载地址:commons-net-3.0.1

  2. 封装的上传方法:

 /**
     * Description: 向FTP服务器上传文件
     * 
     * @param url
     *            FTP服务器hostname
     * @param port
     *            FTP服务器端口
     * @param username
     *            FTP登录账号
     * @param password
     *            FTP登录密码
     * @param path
     *            FTP服务器保存目录,是linux下的目录形式,如/photo/
     * @param filename
     *            上传到FTP服务器上的文件名,是自己定义的名字,
     * @param input
     *            输入流
     * @return 成功返回true,否则返回false
     * @throws SocketException
     * @throws IOException
     */


    public static boolean uploadFile(String url, int port, String username,
            String password, String path, String filename, InputStream input)
            throws SocketException, IOException {
        String TAG="aiyong";
        boolean success = false;
            //新建ftp对象
        FTPClient ftp = new FTPClient();
        Log.i(TAG, "创建FTP对象成功");

        int reply;
        //设置超时
        ftp.setConnectTimeout(3000);
        ftp.connect(url, port);// 连接FTP服务器
        // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
        ftp.login(username, password);// 登录
        Log.i(TAG, "登陆FTP成功");
        //连接的状态码
        reply = ftp.getReplyCode();
        ftp.setDataTimeout(12000);
        //判断是否连接上ftp
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            return success;
        }
        ftp.enterLocalPassiveMode();
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        //对传入的路径进行拆分,ftp里创建路径要一层一层的创建。
        String[] argPath = path.split("/");
        System.out.println("path:" + path);
        String pathName = null;
        //一层一层的开始创建路径
        for (int i = 0; i < argPath.length; i++) {
            pathName = argPath[i];
            ftp.makeDirectory(pathName);
            //创建一层就切换到该目录下
            ftp.changeWorkingDirectory(pathName);

        }

        Log.i(TAG, "FTP创建目录成功");
        //保存文件到路径下。
        ftp.storeFile(filename, input);
        Log.i(TAG, "FTP上传文件成功");
        //关闭流,退出ftp
        input.close();
        ftp.logout();
        success = true;
        //判断是否退出成功,不成功就再断开连接。
        if (ftp.isConnected()) {
            try {
                ftp.disconnect();
            } catch (IOException ioe) {
                throw new RuntimeException("FTP disconnect fail!", ioe);
            }
        }
        return success;
    }
  • 接下来就是在android里调用该方法进行上传数据了,一般都是写在一个service里,但是要注意的是ftp不能写在主线程中,要写个多线程去实现上传的方法,不然会报错。
    android service里调用方法上传代码片段:
Thread sendThread=new Thread() {

    public void run() {
            File file = new File(FilePath);

            mfile = file.getName();
            try {
                    in = new FileInputStream(file);
                } catch (FileNotFoundException e1) {

                    e1.printStackTrace();
                }
            try {
                    upFile = UpFTP.uploadFile(ftpip,
                    Integer.parseInt("21"), ftpUserName,
                    ftpPassWord, remotePath, mfile, in);
                    SystemClock.sleep(3000);
                    Log.i(TAG, "UpFile:"+ upFile);
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                }
                };
    sendThread.start();

android ftp上传一定要起个多线程去实现,不能在android
主线程里操作上传数据,不然会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值