Android FTP操作

来源:互联网 发布:大数据 服务型政府 编辑:程序博客网 时间:2024/06/06 19:48

这里使用第三方commons-net-3.0.1.jar

连接FTP

private void ftpLogin() throws IOException {        int reply;        // FTP连接        FTPClient ftpClient = new FTPClient();        ftpClient.setConnectTimeout(3000);        ftpClient.setControlEncoding("GBK");        try {            ftpClient.connect(hostName, port);            reply = ftpClient.getReplyCode();            if (!FTPReply.isPositiveCompletion(reply)) {                ftpClient.disconnect();                sendHandleMsg(0, FTPDOWNLOAD_MODE.Connect_Failure);                return;            }        } catch (Exception e) {            sendHandleMsg(0, FTPDOWNLOAD_MODE.Connect_Failure);            return;        }        // FTP登陆        try {            ftpClient.login(username, password);            reply = ftpClient.getReplyCode();            if (!FTPReply.isPositiveCompletion(reply)) {                ftpClient.disconnect();                sendHandleMsg(0, FTPDOWNLOAD_MODE.Login_Failure);            }            ftpClient.enterLocalPassiveMode();// 设置被动模式            String sysType = ftpClient.getSystemType();            FTPClientConfig config = new FTPClientConfig(sysType.split(" ")[0]);            config.setServerLanguageCode("zh");            ftpClient.configure(config);            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);        } catch (Exception e) {            sendHandleMsg(0, FTPDOWNLOAD_MODE.Login_Failure);            return;        }        sendHandleMsg(0, FTPDOWNLOAD_MODE.Login_Success);    }

下载

/**     * 从FTP服务器上下载文件,支持断点续传     *      * @param remote     *            远程文件路径     * @param local     *            本地文件路径     * @return 上传的状态     * @throws IOException     */    public DownloadStatus download(String remote, String local, FTPClient ftpClient) throws IOException {        // 设置被动模式        ftpClient.enterLocalPassiveMode();        // 设置以二进制方式传输        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);        ftpClient.setControlEncoding("GBK");        DownloadStatus result;        // 检查远程文件是否存在        FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("GBK"), "iso-8859-1"));        if (files.length != 1) {            System.out.println("远程文件不存在");            for (int i = 0; i < files.length; i++) {            }            return DownloadStatus.Remote_File_Noexist;        }        long lRemoteSize = files[0].getSize();        File f = new File(local);        // 本地存在文件,进行断点下载        if (f.exists()) {            long localSize = f.length();            // 判断本地文件大小是否大于远程文件大小            if (localSize >= lRemoteSize) {                System.out.println("本地文件大于远程文件,下载中止");                return DownloadStatus.Local_Bigger_Remote;            }            // 进行断点续传,并记录状态            FileOutputStream out = new FileOutputStream(f, true);            ftpClient.setRestartOffset(localSize);            InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"), "iso-8859-1"));            byte[] bytes = new byte[1024];            int c;            while ((c = in.read(bytes)) != -1) {                out.write(bytes, 0, c);                localSize += c;            }            in.close();            out.close();            boolean isDo = ftpClient.completePendingCommand();            if (isDo) {                result = DownloadStatus.Download_From_Break_Success;            } else {                result = DownloadStatus.Download_From_Break_Failed;            }        } else {            OutputStream out = new FileOutputStream(f);            InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"), "iso-8859-1"));            byte[] bytes = new byte[1024];            // long step = lRemoteSize / 100;            long process = 0;            long localSize = 0L;            int c;            while ((c = in.read(bytes)) != -1) {                out.write(bytes, 0, c);                localSize += c;            }            in.close();            out.close();            boolean upNewStatus = ftpClient.completePendingCommand();            if (upNewStatus) {                result = DownloadStatus.Download_New_Success;            } else {                result = DownloadStatus.Download_New_Failed;            }        }        return result;    }

上传

/**     * 上传文件到FTP服务器,支持断点续传     *      * @param local     *            本地文件名称,绝对路径     * @param remote     *            远程文件路径     * @return 上传结果     * @throws IOException     */    public UploadStatus upload(String local, String remote, FTPClient ftpClient) throws IOException {        // 设置PassiveMode传输        ftpClient.enterLocalPassiveMode();        // 设置以二进制流的方式传输        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);        ftpClient.setControlEncoding("GBK");        UploadStatus result;        // 对远程目录的处理        String remoteFileName = remote;        if (remote.contains("/")) {            remoteFileName = remote.substring(remote.lastIndexOf("/") + 1);            // 创建服务器远程目录结构,创建失败直接返回            if (CreateDirecroty(remote, ftpClient) == UploadStatus.Create_Directory_Fail) {                return UploadStatus.Create_Directory_Fail;            }        }        // 检查远程是否存在文件        FTPFile[] files = ftpClient.listFiles(new String(remoteFileName.getBytes("GBK"), "iso-8859-1"));        if (files.length == 1) {            long remoteSize = files[0].getSize();            File f = new File(local);            long localSize = f.length();            if (remoteSize == localSize) {                return UploadStatus.File_Exits;            } else if (remoteSize > localSize) {                return UploadStatus.Remote_Bigger_Local;            }            // 尝试移动文件内读取指针,实现断点续传            result = uploadFile(remoteFileName, f, ftpClient, remoteSize);            // 如果断点续传没有成功,则删除服务器上文件,重新上传            if (result == UploadStatus.Upload_From_Break_Failed) {                if (!ftpClient.deleteFile(remoteFileName)) {                    return UploadStatus.Delete_Remote_Faild;                }                result = uploadFile(remoteFileName, f, ftpClient, 0);            }        } else {            result = uploadFile(remoteFileName, new File(local), ftpClient, 0);        }        return result;    }

创建远程服务器目录

/**     * 递归创建远程服务器目录     *      * @param remote     *            远程服务器文件绝对路径     * @param ftpClient     *            FTPClient对象     * @return 目录创建是否成功     * @throws IOException     */    public UploadStatus CreateDirecroty(String remote, FTPClient ftpClient) throws IOException {        UploadStatus status = UploadStatus.Create_Directory_Success;        String directory = remote.substring(0, remote.lastIndexOf("/") + 1);        if (!directory.equalsIgnoreCase("/") && !ftpClient.changeWorkingDirectory(new String(directory.getBytes("GBK"), "iso-8859-1"))) {            // 如果远程目录不存在,则递归创建远程服务器目录            int start = 0;            int end = 0;            if (directory.startsWith("/")) {                start = 1;            } else {                start = 0;            }            end = directory.indexOf("/", start);            while (true) {                String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1");                if (!ftpClient.changeWorkingDirectory(subDirectory)) {                    if (ftpClient.makeDirectory(subDirectory)) {                        ftpClient.changeWorkingDirectory(subDirectory);                    } else {                        System.out.println("创建目录失败");                        return UploadStatus.Create_Directory_Fail;                    }                }                start = end + 1;                end = directory.indexOf("/", start);                // 检查所有目录是否创建完毕                if (end <= start) {                    break;                }            }        }        return status;    }
0 0
原创粉丝点击