FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
01
—
1.FTP远程建立连接
public static final String userName = "root";
public static final String password = "root";
public static final String url = "192.168.1.251";
public static final int port = 21;
public static final String fileName = AppUtil.createName(System.currentTimeMillis());
public static final String localPath = FileUtil.getNuctechPath();// 本地路径;
public static final String remotePath = "/mnt/660010F011"; //FTP远程文件夹目录
public static final String userName = "root";
public static final String password = "root";
public static final String url = "192.168.1.251";
public static final int port = 21;
public static final String fileName = AppUtil.createName(System.currentTimeMillis());
public static final String localPath = FileUtil.getNuctechPath();// 本地路径;
public static final String remotePath = "/mnt/660010F011"; //FTP远程文件夹目录
FtpClient ftp = FTPHelper.getConnectionFTP(FTPConstant.url,
FTPConstant.port, FTPConstant.userName, FTPConstant.password);
02
—
上传
/**
* 异步线程去上传图片
* @author derik
*
*/
class UploadAsytask extends AsyncTask{
private ImageItem item;
boolean uploadFile = false;
public UploadAsytask(ImageItem item) {
this.item = item;
}
@Override
protected void onPostExecute(Boolean uploadFile) {
super.onPostExecute(uploadFile);
if(uploadFile){
handShow(getString(R.string.submit_file_successful));
finish();
Bimp.tempSelectBitmap.clear();
}else{
handShow(getString(R.string.submit_file_failure));
}
}
@Override
protected Boolean doInBackground(Boolean... params) {
ftp = FTPHelper.getConnectionFTP(FTPConstant.url,
FTPConstant.port, FTPConstant.userName, FTPConstant.password);
try {
uploadFile = FTPHelper.uploadFile(ftp, FTPConstant.remotePath, FTPConstant.fileName, new FileInputStream(new File (item.getImagePath())));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return uploadFile;
}
}
03
FTPHelper工具类
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import android.text.TextUtils;
public class FTPHelper {
/**
* 获得连接-FTP方式
*
* @param hostname
* FTP服务器地址
* @param port
* FTP服务器端口
* @param username
* FTP登录用户名
* @param password
* FTP登录密码
* @return FTPClient
*/
public static FTPClient getConnectionFTP(String hostName, int port,
String userName, String passWord) {
// 创建FTPClient对象
FTPClient ftp = new FTPClient();
try {
// 连接FTP服务器
ftp.connect(hostName, port);
// 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件
ftp.setControlEncoding("GBK");
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setServerLanguageCode("zh");
// 登录ftp
ftp.login(userName, passWord);
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
ftp.disconnect();
System.out.println("连接服务器失败");
}
System.out.println("登陆服务器成功");
} catch (IOException e) {
e.printStackTrace();
}
return ftp;
}
/**
* 关闭连接-FTP方式
*
* @param ftp
* FTPClient对象
* @return boolean
*/
public static boolean closeFTP(FTPClient ftp) {
if (ftp.isConnected()) {
try {
ftp.disconnect();
System.out.println("ftp已经关闭");
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 上传文件-FTP方式
*
* @param ftp
* FTPClient对象
* @param path
* FTP服务器上传地址
* @param filename
* 本地文件路径
* @param inputStream
* 输入流
* @return boolean
*/
public static boolean uploadFile(FTPClient ftp, String path,
String fileName, InputStream inputStream) {
boolean success = false;
try {
ftp.makeDirectory(path);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.setBufferSize(1024);
ftp.setControlEncoding("UTF-8");
ftp.enterLocalPassiveMode();
ftp.changeWorkingDirectory(path);// 转移到指定FTP服务器目录
FTPFile[] fs = ftp.listFiles();// 得到目录的相应文件列表
if(!TextUtils.isEmpty(fileName)){
fileName = FTPHelper.changeName(fileName, fs);
}
fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
path = new String(path.getBytes("GBK"), "ISO-8859-1");
// 转到指定上传目录
ftp.changeWorkingDirectory(path);
// 将上传文件存储到指定目录
ftp.setFileType(FTP.BINARY_FILE_TYPE);
// 如果缺省该句 传输txt正常 但图片和其他格式的文件传输出现乱码
ftp.storeFile(fileName, inputStream);
// 关闭输入流
inputStream.close();
// 退出ftp
//ftp.logout();
// 表示上传成功
success = true;
System.out.println("上传成功。。。。。。");
} catch (Exception e) {
e.printStackTrace();
}
return success;
}
/**
* 删除文件-FTP方式
*
* @param ftp
* FTPClient对象
* @param path
* FTP服务器上传地址
* @param filename
* FTP服务器上要删除的文件名
* @return
*/
public static boolean deleteFile(FTPClient ftp, String path, String fileName) {
boolean success = false;
try {
ftp.changeWorkingDirectory(path);// 转移到指定FTP服务器目录
fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
path = new String(path.getBytes("GBK"), "ISO-8859-1");
ftp.deleteFile(fileName);
ftp.logout();
success = true;
} catch (Exception e) {
e.printStackTrace();
}
return success;
}
/**
* 上传文件-FTP方式
*
* @param ftp
* FTPClient对象
* @param path
* FTP服务器上传地址
* @param fileName
* 本地文件路径
* @param localPath
* 本里存储路径
* @return boolean
*/
public static boolean downFile(FTPClient ftp, String path, String fileName,
String localPath) {
boolean success = false;
try {
ftp.changeWorkingDirectory(path);// 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles(); // 得到目录的相应文件列表
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
File localFile = new File(localPath + "\\" + ff.getName());
OutputStream outputStream = new FileOutputStream(localFile);
// 将文件保存到输出流outputStream中
ftp.retrieveFile(new String(ff.getName().getBytes("GBK"),
"ISO-8859-1"), outputStream);
outputStream.flush();
outputStream.close();
System.out.println("下载成功");
}
}
ftp.logout();
success = true;
} catch (Exception e) {
e.printStackTrace();
}
return success;
}
/**
* 判断是否有重名文件
*
* @param fileName
* @param fs
* @return
*/
public static boolean isFileExist(String fileName, FTPFile[] fs) {
for (int i = 0; i
FTPFile ff = fs[i];
if (ff.getName().equals(fileName)) {
return true; // 如果存在返回 正确信号
}
}
return false; // 如果不存在返回错误信号
}
/**
* 根据重名判断的结果 生成新的文件的名称
*
* @param fileName
* @param fs
* @return
*/
public static String changeName(String fileName, FTPFile[] fs) {
int n = 0;
// fileName = fileName.append(fileName);
while (isFileExist(fileName.toString(), fs)) {
n++;
String a = "[" + n + "]";
int b = fileName.lastIndexOf(".");// 最后一出现小数点的位置
int c = fileName.lastIndexOf("[");// 最后一次"["出现的位置
if (c
c = b;
}
StringBuffer name = new StringBuffer(fileName.substring(0, c));// 文件的名字
StringBuffer suffix = new StringBuffer(fileName.substring(b + 1));// 后缀的名称
fileName = name.append(a) + "." + suffix;
}
return fileName.toString();
}
/**
* 判断两个集合是否相同
*
* @param list1
* @param list2
* @return
*/
public static boolean equalList(List list1, List list2) {
return (list1.size() == list2.size()) && list1.containsAll(list2);
}
/**
* 判断两个集合的不同值(只限于strlist)
*
* @param list1
* @param list2
*/
public static List getUncontain(List ftpList,
List localDirList) {
List tempList = new ArrayList();
for (String str1 : ftpList) {
if (!localDirList.contains(str1)) {
// list2中不包含str1
tempList.add(str1);
}
}
return tempList;
}
/**
* 下载单个文件,可实现断点下载.
*
* @param serverPath
* Ftp目录及文件路径
* @param localPath
* 本地目录
* @param fileName
* 下载之后的文件名称
* @param listener
* 监听器
* @throws IOException
*/
public static void downloadSingleFile(FTPClient ftpClient,String serverPath, String localPath,
String fileName, FtpProgressListener listener) throws Exception {
listener.onFtpProgress(Constant.FTP_CONNECT_SUCCESS, 0, null);
// 先判断服务器文件是否存在
FTPFile[] files = ftpClient.listFiles(serverPath);
if (files.length == 0) {
listener.onFtpProgress(Constant.FTP_FILE_NOTEXISTS, 0, null);
return;
}
// 创建本地文件夹
File mkFile = new File(localPath);
if (!mkFile.exists()) {
mkFile.mkdirs();
}
localPath = localPath + fileName;
// 接着判断下载的文件是否能断点下载
long serverSize = files[0].getSize(); // 获取远程文件的长度
File localFile = new File(localPath);
long localSize = 0;
if (localFile.exists()) {
localSize = localFile.length(); // 如果本地文件存在,获取本地文件的长度
if (localSize >= serverSize) {
File file = new File(localPath);
file.delete();
}
}
// 进度
long step = serverSize / 100;
long process = 0;
long currentSize = 0;
// 开始准备下载文件
OutputStream out = new FileOutputStream(localFile, true);
ftpClient.setRestartOffset(localSize);
InputStream input = ftpClient.retrieveFileStream(serverPath);
byte[] b = new byte[1024];
int length = 0;
while ((length = input.read(b)) != -1) {
out.write(b, 0, length);
currentSize = currentSize + length;
if (currentSize / step != process) {
process = currentSize / step;
if (process % 5 == 0) { // 每隔%5的进度返回一次
listener.onFtpProgress(Constant.FTP_DOWN_LOADING, process,
null);
}
}
}
out.flush();
out.close();
input.close();
// 此方法是来确保流处理完毕,如果没有此方法,可能会造成现程序死掉
if (ftpClient.completePendingCommand()) {
listener.onFtpProgress(Constant.FTP_DOWN_SUCCESS, 0, new File(
localPath));
} else {
listener.onFtpProgress(Constant.FTP_DOWN_FAIL, 0, null);
}
// 下载完成之后关闭连接
closeFTP(ftpClient);
listener.onFtpProgress(Constant.FTP_DISCONNECT_SUCCESS, 0, null);
return;
}
/*
* 进度监听器
*/
public interface FtpProgressListener {
/**
*
* @Description TODO FTP 文件长传下载进度触发
* @param currentStatus
* 当前FTP状态
* @param process
* 当前进度
* @param targetFile
* 目标文件
*/
public void onFtpProgress(int currentStatus, long process,
File targetFile);
}
}
最后推荐一款电脑上边传图工具
wechat: derikli123
领取专属 10元无门槛券
私享最新 技术干货