使用FTP上传、下载文件

  • v1_838293
    了解作者
  • 536.9KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-05-26 09:35
    上传日期
使用FTP协议进程远程传输,能够进行文件上传和下载的功能。
ContinueFTP.rar
内容介绍
package com.kunpeng.ftp; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.RandomAccessFile; import org.apache.commons.net.PrintCommandListener; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import android.content.Context; import android.os.Handler; import android.os.Message; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; /** */ /** * 支持断点续传的FTP实用类 * * @version 0.1 实现基本断点上传下载 * @version 0.2 实现上传下载进度汇报 * @version 0.3 实现中文目录创建及中文文件创建,添加对于中文的支持 */ public class FTPContinue { // 连接配置文件 public FTPClient ftpClient = new FTPClient(); private static final String ftpHost = "218.92.206.164"; private static final int ftpPort = 21; private static final String ftpUserName = "520down"; private static final String ftpPassword = "520down"; private Thread mThread; String remote; // 远程文件 String local; // 本地文件 // 控件 private Context mContext; private ProgressBar mProgressBar; private TextView mTextView; private Button mButton; private long process; private Handler mParentHandler; private static final int DOWN_UPDATE = 1; private static final int DOWN_OVER = 2; private static final int DOWN_BREAK = 3; private boolean interceptFlag = false; // 中断标记 public FTPContinue(Context context, ProgressBar progressbar, TextView textvie, Button button, Handler handler) { mContext = context; mProgressBar = progressbar; mTextView = textvie; mButton = button; mParentHandler = handler; // 设置将过程中使用到的命令输出到控制台 this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); } /** */ /** * 连接到FTP服务器 * * @param hostname * 主机名 * @param port * 端口 * @param username * 用户名 * @param password * 密码 * @return 是否连接成功 * @throws IOException */ public boolean connect() throws IOException { ftpClient.connect(ftpHost, ftpPort); ftpClient.setControlEncoding("GBK"); if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { if (ftpClient.login(ftpUserName, ftpPassword)) { return true; } } disconnect(); return false; } /** */ /** * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 * * @param remote * 远程文件路径 * @param local * 本地文件路径 * @return 上传的状态 * @throws IOException */ public void download(String strRemote, String strLocal) throws IOException { this.remote = strRemote; this.local = strLocal; mThread = new Thread(mRunnable); mThread.start(); } // 在进程中执行导出操作 private Runnable mRunnable = new Runnable() { @Override public void run() { try { // 设置被动模式 ftpClient.enterLocalPassiveMode(); // 设置以二进制方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // DownloadStatus result; // 检查远程文件是否存在 FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("GBK"), "iso-8859-1")); if (files.length != 1) { System.out.println("远程文件不存在"); // 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]; long step = lRemoteSize / 100; process = localSize / step; int c; while ((c = in.read(bytes)) != -1) { if (interceptFlag) { break; } out.write(bytes, 0, c); localSize += c; long nowProcess = localSize / step; if (nowProcess > process) { process = nowProcess; if (process % 1 == 0) System.out.println("下载进度:" + process); mHandler.sendEmptyMessage(DOWN_UPDATE); // TODO 更新文件下载进度,值存放在process变量中 } } in.close(); out.close(); if (c <= 0) { mHandler.sendEmptyMessage(DOWN_OVER); } boolean isDo = ftpClient.completePendingCommand(); if (isDo) { // result = DownloadStatus.Download_From_Break_Success; mHandler.sendEmptyMessage(DOWN_OVER); } else { // result = DownloadStatus.Download_From_Break_Failed; mHandler.sendEmptyMessage(DOWN_BREAK); } } 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; process = 0; long localSize = 0L; int c; while ((c = in.read(bytes)) != -1) { if (interceptFlag) { break; } out.write(bytes, 0, c); localSize += c; long nowProcess = localSize / step; if (nowProcess > process) { process = nowProcess; if (process % 1 == 0) System.out.println("下载进度:" + process); mHandler.sendEmptyMessage(DOWN_UPDATE); // TODO 更新文件下载进度,值存放在process变量中 } } in.close(); out.close(); if (c <= 0) { mHandler.sendEmptyMessage(DOWN_OVER); } boolean isDo = ftpClient.completePendingCommand(); if (isDo) { // result = DownloadStatus.Download_From_Break_Success; mHandler.sendEmptyMessage(DOWN_OVER); } else { // result = DownloadStatus.Download_From_Break_Failed; mHandler.sendEmptyMessage(DOWN_BREAK); } } // return result; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; /** */ /** * 断开与远程服务器的连接 * * @throws IOException */ public void disconnect() { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } /** */ /** * 递归创建远程服务器目录 * * @param remote * 远程服务器文件绝对路径 * @param ftpClient * FTPClient 对象 * @return 目录创建是否成功 * @throws IOException */ public boolean CreateDirecroty(String remote, FTPClient ftpClient) throws IOException { 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 false; } } start = end + 1; end = directory.indexOf
评论
    相关推荐
    • FTP client
      基于Qt4.7 的FTP客户端,能对多个站点进行管理和资源的下载。
    • FTP工具
      FTP工具
    • ftp工具
      ftp工具
    • ftp同步
      ftp同步 FTP Synchronizer
    • FTP工具
      FTP工具
    • ftp
      FTP Golang中的简单客户端-服务器ftp实现 ftp客户端 当前实现以下功能: 目录 光盘 残障人士 ftp服务器 通过TCP套接字与ftpClient通信以显示目录信息。 硬编码以使用localhost端口1202 目前实现: 目录 光盘 ...
    • ftp client
      ftp 客户端,免费绿色,解压后就可以直接用,方便易用。
    • FTP Server
      一款很不錯的FTP軟件,試了很多軟件,都沒這款好用,架設FTP服務很容易
    • FTP commander
      免费的FTP客户端。 具有一般FTP的全部功能。 文件比较小,性能稳定
    • FTP12312321
      FTP 64位 直接解压就可以用,无需安装秘钥。FTP 64位 直接解压就可以用,无需安装秘钥。FTP 64位 直接解压就可以用,无需安装秘钥。