本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之前所做项目的整理。
主要的代码块如下所示,对代码中相应地方稍作调整,复制粘贴到项目即可以使用,代码中会提供相应注释。
1.MainActivity
-
public
class MainActivity extends Activity implements OnClickListener{
-
private
final String TAG=
“MainActivity”;
-
private Button buttonUpLoad =
;
-
private Button buttonDownLoad =
;
-
private SFTPUtils sftp;
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_sftpmain);
-
init();
-
}
-
-
public void init(){
-
//获取控件对象
-
buttonUpLoad = (Button) findViewById(R.id.button_upload);
-
buttonDownLoad = (Button) findViewById(R.id.button_download);
-
//设置控件对应相应函数
-
buttonUpLoad.setOnClickListener(
this);
-
buttonDownLoad.setOnClickListener(
this);
-
sftp =
new SFTPUtils(
“SFTP服务器IP”,
“用户名”,
“密码”);
-
}
-
public void onClick(final View v) {
-
// TODO Auto-generated method stub
-
new Thread() {
-
@Override
-
public void run() {
-
//这里写入子线程需要做的工作
-
-
switch (v.getId()) {
-
case R.id.button_upload: {
-
//上传文件
-
Log.d(TAG,
“上传文件”);
-
String localPath =
“sdcard/xml/”;
-
String remotePath =
“test”;
-
sftp.connect();
-
Log.d(TAG,
“连接成功”);
-
sftp.uploadFile(remotePath,
“APPInfo.xml”, localPath,
“APPInfo.xml”);
-
Log.d(TAG,
“上传成功”);
-
sftp.disconnect();
-
Log.d(TAG,
“断开连接”);
-
}
-
break;
-
-
case R.id.button_download: {
-
//下载文件
-
Log.d(TAG,
“下载文件”);
-
String localPath =
“sdcard/download/”;
-
String remotePath =
“test”;
-
sftp.connect();
-
Log.d(TAG,
“连接成功”);
-
sftp.downloadFile(remotePath,
“APPInfo.xml”, localPath,
“APPInfo.xml”);
-
Log.d(TAG,
“下载成功”);
-
sftp.disconnect();
-
Log.d(TAG,
“断开连接”);
-
-
}
-
break;
-
default:
-
break;
-
}
-
}
-
}.start();
-
};
-
}
2.SFTPUtils
-
public
class SFTPUtils {
-
-
private String TAG=
"SFTPUtils";
-
private String host;
-
private String username;
-
private String password;
-
private
int port =
22;
-
private ChannelSftp sftp =
;
-
private Session sshSession =
;
-
-
public SFTPUtils (String host, String username, String password) {
-
this.host = host;
-
this.username = username;
-
this.password = password;
-
}
-
-
/**
-
* connect server via sftp
-
*/
-
public ChannelSftp connect() {
-
JSch jsch =
new JSch();
-
try {
-
sshSession = jsch.getSession(username, host, port);
-
sshSession.setPassword(password);
-
Properties sshConfig =
new Properties();
-
sshConfig.put(
"StrictHostKeyChecking",
"no");
-
sshSession.setConfig(sshConfig);
-
sshSession.connect();
-
Channel channel = sshSession.openChannel(
"sftp");
-
if (channel !=
) {
-
channel.connect();
-
}
else {
-
Log.e(TAG,
"channel connecting failed.");
-
}
-
sftp = (ChannelSftp) channel;
-
}
catch (JSchException e) {
-
e.printStackTrace();
-
}
-
return sftp;
-
}
-
-
-
/**
-
* 断开服务器
-
*/
-
public void disconnect() {
-
if (
this.sftp !=
) {
-
if (
this.sftp.isConnected()) {
-
this.sftp.disconnect();
-
Log.d(TAG,
"sftp is closed already");
-
}
-
}
-
if (
this.sshSession !=
) {
-
if (
this.sshSession.isConnected()) {
-
this.sshSession.disconnect();
-
Log.d(TAG,
"sshSession is closed already");
-
}
-
}
-
}
-
-
/**
-
* 单个文件上传
-
* @param remotePath
-
* @param remoteFileName
-
* @param localPath
-
* @param localFileName
-
* @return
-
*/
-
public boolean uploadFile(String remotePath, String remoteFileName,
-
String localPath, String localFileName) {
-
FileInputStream in =
;
-
try {
-
createDir(remotePath);
-
System.out.println(remotePath);
-
File file =
new File(localPath + localFileName);
-
in =
new FileInputStream(file);
-
System.out.println(in);
-
sftp.put(in, remoteFileName);
-
System.out.println(sftp);
-
return
true;
-
}
catch (FileNotFoundException e) {
-
e.printStackTrace();
-
}
catch (SftpException e) {
-
e.printStackTrace();
-
}
finally {
-
if (in !=
) {
-
try {
-
in.close();
-
}
catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
return
false;
-
}
-
-
/**
-
* 批量上传
-
* @param remotePath
-
* @param localPath
-
* @param del
-
* @return
-
*/
-
public boolean bacthUploadFile(String remotePath, String localPath,
-
boolean del) {
-
try {
-
File file =
new File(localPath);
-
File[] files = file.listFiles();
-
for (
int i =
0; i < files.length; i++) {
-
if (files[i].isFile()
-
&& files[i].getName().indexOf(
"bak") == -
1) {
-
synchronized(remotePath){
-
if (
this.uploadFile(remotePath, files[i].getName(),
-
localPath, files[i].getName())
-
&& del) {
-
deleteFile(localPath + files[i].getName());
-
}
-
}
-
}
-
}
-
return
true;
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
finally {
-
this.disconnect();
-
}
-
return
false;
-
-
}
-
-
/**
-
* 批量下载文件
-
*
-
* @param remotPath
-
* 远程下载目录(以路径符号结束)
-
* @param localPath
-
* 本地保存目录(以路径符号结束)
-
* @param fileFormat
-
* 下载文件格式(以特定字符开头,为空不做检验)
-
* @param del
-
* 下载后是否删除sftp文件
-
* @return
-
*/
-
@SuppressWarnings(
"rawtypes")
-
public boolean batchDownLoadFile(String remotPath, String localPath,
-
String fileFormat, boolean del) {
-
try {
-
connect();
-
Vector v = listFiles(remotPath);
-
if (v.size() >
0) {
-
-
Iterator it = v.iterator();
-
while (it.hasNext()) {
-
LsEntry entry = (LsEntry) it.next();
-
String filename = entry.getFilename();
-
SftpATTRS attrs = entry.getAttrs();
-
if (!attrs.isDir()) {
-
if (fileFormat !=
&& !
"".equals(fileFormat.trim())) {
-
if (filename.startsWith(fileFormat)) {
-
if (
this.downloadFile(remotPath, filename,
-
localPath, filename)
-
&& del) {
-
deleteSFTP(remotPath, filename);
-
}
-
}
-
}
else {
-
if (
this.downloadFile(remotPath, filename,
-
localPath, filename)
-
&& del) {
-
deleteSFTP(remotPath, filename);
-
}
-
}
-
}
-
}
-
}
-
}
catch (SftpException e) {
-
e.printStackTrace();
-
}
finally {
-
this.disconnect();
-
}
-
return
false;
-
}
-
-
/**
-
* 单个文件下载
-
* @param remotePath
-
* @param remoteFileName
-
* @param localPath
-
* @param localFileName
-
* @return
-
*/
-
public boolean downloadFile(String remotePath, String remoteFileName,
-
String localPath, String localFileName) {
-
try {
-
sftp.cd(remotePath);
-
File file =
new File(localPath + localFileName);
-
mkdirs(localPath + localFileName);
-
sftp.get(remoteFileName,
new FileOutputStream(file));
-
return
true;
-
}
catch (FileNotFoundException e) {
-
e.printStackTrace();
-
}
catch (SftpException e) {
-
e.printStackTrace();
-
}
-
-
return
false;
-
}
-
-
/**
-
* 删除文件
-
* @param filePath
-
* @return
-
*/
-
public boolean deleteFile(String filePath) {
-
File file =
new File(filePath);
-
if (!file.exists()) {
-
return
false;
-
}
-
if (!file.isFile()) {
-
return
false;
-
}
-
return file.delete();
-
}
-
-
public boolean createDir(String createpath) {
-
try {
-
if (isDirExist(createpath)) {
-
this.sftp.cd(createpath);
-
Log.d(TAG,createpath);
-
return
true;
-
}
-
String pathArry[] = createpath.split(
"/");
-
StringBuffer filePath =
new StringBuffer(
"/");
-
for (String path : pathArry) {
-
if (path.equals(
"")) {
-
continue;
-
}
-
filePath.append(path +
"/");
-
if (isDirExist(createpath)) {
-
sftp.cd(createpath);
-
}
else {
-
sftp.mkdir(createpath);
-
sftp.cd(createpath);
-
}
-
}
-
this.sftp.cd(createpath);
-
return
true;
-
}
catch (SftpException e) {
-
e.printStackTrace();
-
}
-
return
false;
-
}
-
-
/**
-
* 判断目录是否存在
-
* @param directory
-
* @return
-
*/
-
@SuppressLint(
"DefaultLocale")
-
public boolean isDirExist(String directory) {
-
boolean isDirExistFlag =
false;
-
try {
-
SftpATTRS sftpATTRS = sftp.lstat(directory);
-
isDirExistFlag =
true;
-
return sftpATTRS.isDir();
-
}
catch (Exception e) {
-
if (e.getMessage().toLowerCase().equals(
"no such file")) {
-
isDirExistFlag =
false;
-
}
-
}
-
return isDirExistFlag;
-
}
-
-
public void deleteSFTP(String directory, String deleteFile) {
-
try {
-
sftp.cd(directory);
-
sftp.rm(deleteFile);
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
-
/**
-
* 创建目录
-
* @param path
-
*/
-
public void mkdirs(String path) {
-
File f =
new File(path);
-
String fs = f.getParent();
-
f =
new File(fs);
-
if (!f.exists()) {
-
f.mkdirs();
-
}
-
}
-
-
/**
-
* 列出目录文件
-
* @param directory
-
* @return
-
* @throws SftpException
-
*/
-
-
@SuppressWarnings(
"rawtypes")
-
public Vector listFiles(String directory) throws SftpException {
-
return sftp.ls(directory);
-
}
-
-
}
4.布局文件:activity_sftpmain.xml
-
<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"
-
>
-
<TextView
-
android:layout_width=
"wrap_content"
-
android:layout_height=
"wrap_content"
-
android:textStyle=
"bold"
-
android:textSize=
"24dip"
-
android:layout_gravity=
"center"
-
android:text=
"SFTP上传下载测试 "/>
-
-
<Button
-
android:id=
"@+id/button_upload"
-
android:layout_width=
"fill_parent"
-
android:layout_height=
"wrap_content"
-
android:text=
"上传"
-
/>
-
-
<Button
-
android:id=
"@+id/button_download"
-
android:layout_width=
"fill_parent"
-
android:layout_height=
"wrap_content"
-
android:text=
"下载"
-
/>
-
-
</LinearLayout>
5.Manifest文件配置
-
<uses-permission android:name=
"android.permission.INTERNET" />
-
<uses-permission android:name=
"android.permission.ACCESS_NETWORK_STATE" />
-
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"/>
本文主要是讲解Android服务器之SFTP服务器的上传下载功能,也是对之前所做项目的整理。
主要的代码块如下所示,对代码中相应地方稍作调整,复制粘贴到项目即可以使用,代码中会提供相应注释。
1.MainActivity
-
public
class MainActivity extends Activity implements OnClickListener{
-
private
final String TAG=
“MainActivity”;
-
private Button buttonUpLoad =
;
-
private Button buttonDownLoad =
;
-
private SFTPUtils sftp;
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_sftpmain);
-
init();
-
}
-
-
public void init(){
-
//获取控件对象
-
buttonUpLoad = (Button) findViewById(R.id.button_upload);
-
buttonDownLoad = (Button) findViewById(R.id.button_download);
-
//设置控件对应相应函数
-
buttonUpLoad.setOnClickListener(
this);
-
buttonDownLoad.setOnClickListener(
this);
-
sftp =
new SFTPUtils(
“SFTP服务器IP”,
“用户名”,
“密码”);
-
}
-
public void onClick(final View v) {
-
// TODO Auto-generated method stub
-
new Thread() {
-
@Override
-
public void run() {
-
//这里写入子线程需要做的工作
-
-
switch (v.getId()) {
-
case R.id.button_upload: {
-
//上传文件
-
Log.d(TAG,
“上传文件”);
-
String localPath =
“sdcard/xml/”;
-
String remotePath =
“test”;
-
sftp.connect();
-
Log.d(TAG,
“连接成功”);
-
sftp.uploadFile(remotePath,
“APPInfo.xml”, localPath,
“APPInfo.xml”);
-
Log.d(TAG,
“上传成功”);
-
sftp.disconnect();
-
Log.d(TAG,
“断开连接”);
-
}
-
break;
-
-
case R.id.button_download: {
-
//下载文件
-
Log.d(TAG,
“下载文件”);
-
String localPath =
“sdcard/download/”;
-
String remotePath =
“test”;
-
sftp.connect();
-
Log.d(TAG,
“连接成功”);
-
sftp.downloadFile(remotePath,
“APPInfo.xml”, localPath,
“APPInfo.xml”);
-
Log.d(TAG,
“下载成功”);
-
sftp.disconnect();
-
Log.d(TAG,
“断开连接”);
-
-
}
-
break;
-
default:
-
break;
-
}
-
}
-
}.start();
-
};
-
}
2.SFTPUtils
-
public
class SFTPUtils {
-
-
private String TAG=
"SFTPUtils";
-
private String host;
-
private String username;
-
private String password;
-
private
int port =
22;
-
private ChannelSftp sftp =
;
-
private Session sshSession =
;
-
-
public SFTPUtils (String host, String username, String password) {
-
this.host = host;
-
this.username = username;
-
this.password = password;
-
}
-
-
/**
-
* connect server via sftp
-
*/
-
public ChannelSftp connect() {
-
JSch jsch =
new JSch();
-
try {
-
sshSession = jsch.getSession(username, host, port);
-
sshSession.setPassword(password);
-
Properties sshConfig =
new Properties();
-
sshConfig.put(
"StrictHostKeyChecking",
"no");
-
sshSession.setConfig(sshConfig);
-
sshSession.connect();
-
Channel channel = sshSession.openChannel(
"sftp");
-
if (channel !=
) {
-
channel.connect();
-
}
else {
-
Log.e(TAG,
"channel connecting failed.");
-
}
-
sftp = (ChannelSftp) channel;
-
}
catch (JSchException e) {
-
e.printStackTrace();
-
}
-
return sftp;
-
}
-
-
-
/**
-
* 断开服务器
-
*/
-
public void disconnect() {
-
if (
this.sftp !=
) {
-
if (
this.sftp.isConnected()) {
-
this.sftp.disconnect();
-
Log.d(TAG,
"sftp is closed already");
-
}
-
}
-
if (
this.sshSession !=
) {
-
if (
this.sshSession.isConnected()) {
-
this.sshSession.disconnect();
-
Log.d(TAG,
"sshSession is closed already");
-
}
-
}
-
}
-
-
/**
-
* 单个文件上传
-
* @param remotePath
-
* @param remoteFileName
-
* @param localPath
-
* @param localFileName
-
* @return
-
*/
-
public boolean uploadFile(String remotePath, String remoteFileName,
-
String localPath, String localFileName) {
-
FileInputStream in =
;
-
try {
-
createDir(remotePath);
-
System.out.println(remotePath);
-
File file =
new File(localPath + localFileName);
-
in =
new FileInputStream(file);
-
System.out.println(in);
-
sftp.put(in, remoteFileName);
-
System.out.println(sftp);
-
return
true;
-
}
catch (FileNotFoundException e) {
-
e.printStackTrace();
-
}
catch (SftpException e) {
-
e.printStackTrace();
-
}
finally {
-
if (in !=
) {
-
try {
-
in.close();
-
}
catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
return
false;
-
}
-
-
/**
-
* 批量上传
-
* @param remotePath
-
* @param localPath
-
* @param del
-
* @return
-
*/
-
public boolean bacthUploadFile(String remotePath, String localPath,
-
boolean del) {
-
try {
-
File file =
new File(localPath);
-
File[] files = file.listFiles();
-
for (
int i =
0; i < files.length; i++) {
-
if (files[i].isFile()
-
&& files[i].getName().indexOf(
"bak") == -
1) {
-
synchronized(remotePath){
-
if (
this.uploadFile(remotePath, files[i].getName(),
-
localPath, files[i].getName())
-
&& del) {
-
deleteFile(localPath + files[i].getName());
-
}
-
}
-
}
-
}
-
return
true;
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
finally {
-
this.disconnect();
-
}
-
return
false;
-
-
}
-
-
/**
-
* 批量下载文件
-
*
-
* @param remotPath
-
* 远程下载目录(以路径符号结束)
-
* @param localPath
-
* 本地保存目录(以路径符号结束)
-
* @param fileFormat
-
* 下载文件格式(以特定字符开头,为空不做检验)
-
* @param del
-
* 下载后是否删除sftp文件
-
* @return
-
*/
-
@SuppressWarnings(
"rawtypes")
-
public boolean batchDownLoadFile(String remotPath, String localPath,
-
String fileFormat, boolean del) {
-
try {
-
connect();
-
Vector v = listFiles(remotPath);
-
if (v.size() >
0) {
-
-
Iterator it = v.iterator();
-
while (it.hasNext()) {
-
LsEntry entry = (LsEntry) it.next();
-
String filename = entry.getFilename();
-
SftpATTRS attrs = entry.getAttrs();
-
if (!attrs.isDir()) {
-
if (fileFormat !=
&& !
"".equals(fileFormat.trim())) {
-
if (filename.startsWith(fileFormat)) {
-
if (
this.downloadFile(remotPath, filename,
-
localPath, filename)
-
&& del) {
-
deleteSFTP(remotPath, filename);
-
}
-
}
-
}
else {
-
if (
this.downloadFile(remotPath, filename,
-
localPath, filename)
-
&& del) {
-
deleteSFTP(remotPath, filename);
-
}
-
}
-
}
-
}
-
}
-
}
catch (SftpException e) {
-
e.printStackTrace();
-
}
finally {
-
this.disconnect();
-
}
-
return
false;
-
}
-
-
/**
-
* 单个文件下载
-
* @param remotePath
-
* @param remoteFileName
-
* @param localPath
-
* @param localFileName
-
* @return
-
*/
-
public boolean downloadFile(String remotePath, String remoteFileName,
-
String localPath, String localFileName) {
-
try {
-
sftp.cd(remotePath);
-
File file =
new File(localPath + localFileName);
-
mkdirs(localPath + localFileName);
-
sftp.get(remoteFileName,
new FileOutputStream(file));
-
return
true;
-
}
catch (FileNotFoundException e) {
-
e.printStackTrace();
-
}
catch (SftpException e) {
-
e.printStackTrace();
-
}
-
-
return
false;
-
}
-
-
/**
-
* 删除文件
-
* @param filePath
-
* @return
-
*/
-
public boolean deleteFile(String filePath) {
-
File file =
new File(filePath);
-
if (!file.exists()) {
-
return
false;
-
}
-
if (!file.isFile()) {
-
return
false;
-
}
-
return file.delete();
-
}
-
-
public boolean createDir(String createpath) {
-
try {
-
if (isDirExist(createpath)) {
-
this.sftp.cd(createpath);
-
Log.d(TAG,createpath);
-
return
true;
-
}
-
String pathArry[] = createpath.split(
"/");
-
StringBuffer filePath =
new StringBuffer(
"/");
-
for (String path : pathArry) {
-
if (path.equals(
"")) {
-
continue;
-
}
-
filePath.append(path +
"/");
-
if (isDirExist(createpath)) {
-
sftp.cd(createpath);
-
}
else {
-
sftp.mkdir(createpath);
-
sftp.cd(createpath);
-
}
-
}
-
this.sftp.cd(createpath);
-
return
true;
-
}
catch (SftpException e) {
-
e.printStackTrace();
-
}
-
return
false;
-
}
-
-
/**
-
* 判断目录是否存在
-
* @param directory
-
* @return
-
*/
-
@SuppressLint(
"DefaultLocale")
-
public boolean isDirExist(String directory) {
-
boolean isDirExistFlag =
false;
-
try {
-
SftpATTRS sftpATTRS = sftp.lstat(directory);
-
isDirExistFlag =
true;
-
return sftpATTRS.isDir();
-
}
catch (Exception e) {
-
if (e.getMessage().toLowerCase().equals(
"no such file")) {
-
isDirExistFlag =
false;
-
}
-
}
-
return isDirExistFlag;
-
}
-
-
public void deleteSFTP(String directory, String deleteFile) {
-
try {
-
sftp.cd(directory);
-
sftp.rm(deleteFile);
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
-
/**
-
* 创建目录
-
* @param path
-
*/
-
public void mkdirs(String path) {
-
File f =
new File(path);
-
String fs = f.getParent();
-
f =
new File(fs);
-
if (!f.exists()) {
-
f.mkdirs();
-
}
-
}
-
-
/**
-
* 列出目录文件
-
* @param directory
-
* @return
-
* @throws SftpException
-
*/
-
-
@SuppressWarnings(
"rawtypes")
-
public Vector listFiles(String directory) throws SftpException {
-
return sftp.ls(directory);
-
}
-
-
}
4.布局文件:activity_sftpmain.xml
-
<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"
-
>
-
<TextView
-
android:layout_width=
"wrap_content"
-
android:layout_height=
"wrap_content"
-
android:textStyle=
"bold"
-
android:textSize=
"24dip"
-
android:layout_gravity=
"center"
-
android:text=
"SFTP上传下载测试 "/>
-
-
<Button
-
android:id=
"@+id/button_upload"
-
android:layout_width=
"fill_parent"
-
android:layout_height=
"wrap_content"
-
android:text=
"上传"
-
/>
-
-
<Button
-
android:id=
"@+id/button_download"
-
android:layout_width=
"fill_parent"
-
android:layout_height=
"wrap_content"
-
android:text=
"下载"
-
/>
-
-
</LinearLayout>
5.Manifest文件配置
-
<uses-permission android:name=
"android.permission.INTERNET" />
-
<uses-permission android:name=
"android.permission.ACCESS_NETWORK_STATE" />
-
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"/>