android FTP数据上传
FTP上传是需要依赖Apache公司的jar包的,jar包下载地址:commons-net-3.0.1
封装的上传方法:
/**
* 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
主线程里操作上传数据,不然会报错。