如果自己没有FTP服务器,可以到www.5944.net上面去申请一个,申请速度很快,申请了既可以用了.
我提供一个我自己申请的:
FTP服务器: 您的FTP用户名: durian 您的FTP密码是: 7389A913676fdf 您的网址为: http://durian 您的FTP地址是: freehost.22u2.cn 服务器IP是: freehost.22u2.cn 到期时间是: 2016/2/12 13:58:07
不过时间太短了,只能够使用一个月.
FTP查看工具:8utfp
这个用来判断上传的文件是否的确在服务器上面了,可以通过它查看.
简单的东西就不多扯淡了,直接上程序:
<1> : 新建Android工程:
<2> 具体的程序如下:
DurianMainActivity.java
package org.durian.durianftp; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.text.InputType; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import org.durian.durianftp.ftp.Ftp; public class DurianMainActivity extends ActionBarActivity implements View.OnClickListener { private final static String TAG="DurianMainActivity"; private final static String FTP_NAME="durian"; private final static String FTP_PWD="7389A913676fdf"; private final static String FTP_URL="freehost.22u2.cn"; private final static String FTP_REMOTE="/durian/web/"; private final static String FTP_FILE_PATH="/sdcard/"; private final static String FTP_FILE_NAME="backup_70-01-02_004832.json"; private final static String FTP_PORT="21"; private final static String FTP_REMOTE_FILE="/durian/web/index.htm"; private final static String FTP_LOCALPATH="/sdcard/web123web123web123web123web123web123web123.html"; private EditText mUrlEdit; private EditText mPortEdit; private EditText mUserEdit; private EditText mPassEdit; private EditText mRemoteEdit; private EditText mFPathEdit; private EditText mFNameEdit; private Button mCancelButton; private Button mLoginButton; private Button mDownLoadButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.durian_main); mUrlEdit=(EditText)findViewById(R.id.urledit); mUrlEdit.setText(FTP_URL); mPortEdit=(EditText)findViewById(R.id.portedit); mPortEdit.setText(FTP_PORT); mUserEdit=(EditText)findViewById(R.id.usernameedit); mUserEdit.setText(FTP_NAME); mPassEdit=(EditText)findViewById(R.id.paswordedit); mPassEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); mPassEdit.setText(FTP_PWD); mRemoteEdit=(EditText)findViewById(R.id.remoteedit); mRemoteEdit.setText(FTP_REMOTE); mFPathEdit=(EditText)findViewById(R.id.fpathedit); mFPathEdit.setText(FTP_FILE_PATH); mFNameEdit=(EditText)findViewById(R.id.fnameedit); mFNameEdit.setText(FTP_FILE_NAME); mCancelButton=(Button)findViewById(R.id.cancel); mLoginButton=(Button)findViewById(R.id.upload); mCancelButton.setOnClickListener(this); mLoginButton.setOnClickListener(this); mDownLoadButton=(Button)findViewById(R.id.download); mDownLoadButton.setOnClickListener(this); } @Override public void onClick(View v) { int id=v.getId(); switch (id){ case R.id.cancel: break; case R.id.upload: /*Ftp.ftpUpload(mUrlEdit.getText().toString(),mPortEdit.getText().toString(), mUserEdit.getText().toString(),mPassEdit.getText().toString(), mRemoteEdit.getText().toString(),mFPathEdit.getText().toString(),mFNameEdit.getText().toString());*/ mUploadFile2FTP.execute(FTP_URL,FTP_PORT,FTP_NAME,FTP_PWD,FTP_REMOTE,FTP_FILE_PATH,FTP_FILE_NAME); break; case R.id.download: mdownLoadFileFromFTP.execute(FTP_URL,FTP_PORT,FTP_NAME,FTP_PWD,FTP_REMOTE_FILE,FTP_LOCALPATH); break; default: break; } } private downLoadFileFromFTP mdownLoadFileFromFTP=new downLoadFileFromFTP(); private class downLoadFileFromFTP extends AsyncTask<String,Integer,String>{ @Override protected String doInBackground(String... params) { Log.i(TAG,"********************************************************"); boolean isOK=Ftp.downLoadFromFTP(FTP_URL,FTP_PORT,FTP_NAME,FTP_PWD,FTP_REMOTE_FILE,FTP_LOCALPATH); if(isOK){ Log.i(TAG,"File Name : "+FTP_REMOTE_FILE+" have already download from your FTP server successfully !"); }else{ Log.i(TAG,"File Name : "+FTP_REMOTE_FILE+" can not download from your FTP server !"); } return isOK?"true":"false"; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); } } private upLoadFile2FTP mUploadFile2FTP=new upLoadFile2FTP(); private class upLoadFile2FTP extends AsyncTask<String,Integer,String>{ @Override protected String doInBackground(String... params) { for(int i=0;i<params.length;i++){ Log.i(TAG,"params["+i+"] : "+params[i]); } publishProgress(50); String isOK=Ftp.ftpUpload(FTP_URL,FTP_PORT,FTP_NAME,FTP_PWD,FTP_REMOTE,FTP_FILE_PATH,FTP_FILE_NAME); if(isOK.contains("1")){ Log.i(TAG,"File Name : "+FTP_FILE_NAME+" have already upload to your FTP server successfully !"); }else{ Log.i(TAG,"File Name : "+FTP_FILE_NAME+" can not upload to your FTP server !"); } publishProgress(100); return isOK; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); Log.i(TAG,"onPostExecute result : "+s); } @Override protected void onPreExecute() { super.onPreExecute(); Log.i(TAG,"onPreExecute"); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Log.i(TAG,"onProgressUpdate values : "+values[0]); } } }
Ftp.java
package org.durian.durianftp.ftp; import android.util.Log; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * Project name : DurianFtp * Created by zhibao.liu on 2016/1/12. * Time : 9:24 * Email [email protected] * Action : durian */ public class Ftp { private final static String TAG="FTP"; public static String ftpUpload(String url, String port, String username, String password, String remotePath, String filenamepath, String filename) { FTPClient ftpClient = new FTPClient(); FileInputStream fis=null; String retMessage="0"; try { ftpClient.connect(url,Integer.parseInt(port)); boolean loginResult=ftpClient.login(username,password); int retCode=ftpClient.getReplyCode(); if(loginResult && FTPReply.isPositiveCompletion(retCode)){ ftpClient.makeDirectory(remotePath); ftpClient.changeWorkingDirectory(remotePath); ftpClient.setBufferSize(1024); ftpClient.setControlEncoding("UTF-8"); ftpClient.enterLocalPassiveMode(); fis=new FileInputStream(filenamepath+filename); ftpClient.storeFile(filename,fis); retMessage="1"; Log.i(TAG,"retMessage : 1"); }else{ retMessage="0"; Log.i(TAG,"retMessage : 0"); } } catch (IOException e) { e.printStackTrace(); } return retMessage; } public static boolean downLoadFromFTP(String url, String port, String username, String password, String remotePath,String localpath){ FTPClient ftpClient=new FTPClient(); InputStream is=null; FileOutputStream io=null; File file=new File(localpath); byte[] buffer=new byte[1024]; int currentlength=0; int len=0; try { ftpClient.connect(url,Integer.parseInt(port)); boolean loginResult=ftpClient.login(username,password); int retCode=ftpClient.getReplyCode(); //following programe is very important //setting it is neccessary ftpClient.enterLocalPassiveMode(); if(!FTPReply.isPositiveCompletion(retCode)) { ftpClient.disconnect(); Log.i(TAG,"FTP server refused connection."); System.exit(1); } if(loginResult && FTPReply.isPositiveCompletion(retCode)){ is=ftpClient.retrieveFileStream(remotePath); io=new FileOutputStream(file,false); while((len=is.read(buffer))!=-1){ io.write(buffer,0,len); currentlength=currentlength+len; Log.i(TAG,"download "+currentlength+" byte"); } is.close(); io.close(); } } catch (IOException e) { e.printStackTrace(); } return true; } }
durian_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="org.durian.durianftp.DurianMainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="URL : " /> <EditText android:id="@+id/urledit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="#ffeeff" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="PORT : " /> <EditText android:id="@+id/portedit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="#ffeeff" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="USERNAME : " /> <EditText android:id="@+id/usernameedit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="#ffeeff" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="PASSWORD : " /> <EditText android:id="@+id/paswordedit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="#ffeeff" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="REMOTE : " /> <EditText android:id="@+id/remoteedit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="#ffeeff" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="FPATH : " /> <EditText android:id="@+id/fpathedit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="#ffeeff" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="FNAME : " /> <EditText android:id="@+id/fnameedit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="#ffeeff" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_weight="3"> <Button android:id="@+id/cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Clear"/> <Button android:id="@+id/upload" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="upload"/> <Button android:id="@+id/download" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="download"/> </LinearLayout> </LinearLayout>
<3> : 运行结果:
下载到sdcard的
上传到ftp服务器的
即可以了.
注意android工程manifest里面配置权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>