本人第一篇博文,记录工作中用到的一些知识,方便自己与他人查阅,菜鸟一枚功力有限,文中如有不当之处还请大神指正。
进入正题,完成本功能需要用到 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:开头,本例亲测下载方法可用,上传没用到故 没验证。