import android.util.Log;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
public class FTPutils {
private String TAG = getClass().getSimpleName();
private FTPClient mFtpClient = null;
// -------------------------------------------------------初始化设置------------------------------------------------
public FTPutils() {
mFtpClient = new FTPClient();
if(mFtpClient.isConnected()){
useCompressedTransfer();
}
}
public void setFtpClient(FTPClient mFtpClient) {
this.mFtpClient = mFtpClient;
}
public void useCompressedTransfer() {
try {
mFtpClient.setFileTransferMode(org.apache.commons.net.ftp.FTP.COMPRESSED_TRANSFER_MODE);
// 使用被动模式设为默认
mFtpClient.enterLocalPassiveMode();
// 二进制文件支持
mFtpClient.setFileType(FTP.BINARY_FILE_TYPE);
//设置缓存
mFtpClient.setBufferSize(1024);
//设置编码格式,防止中文乱码
mFtpClient.setControlEncoding("UTF-8");
//设置连接超时时间
this.mFtpClient.setConnectTimeout(10 * 1000);
//设置数据传输超时时间
// mFtpClient.setDataTimeout(10*1000);
} catch (Exception e) {
e.printStackTrace();
}
}
// -------------------------------------------------------FTP登录------------------------------------------------
/**
* 连接
* @param ip
* @param userName
* @param pass
* @return
* @throws Exception
*/
public boolean connect(String ip, int port,String userName, String pass) {
boolean status = false;
try {
if(!mFtpClient.isConnected()){
mFtpClient.connect(ip,port);
status = mFtpClient.login(userName, pass);
Constant.ftpLoginResult = status;
}
Log.i(TAG, "connect: " + status);
} catch (IOException e) {
e.printStackTrace();
}
return status;
}
// -------------------------------------------------------FTP上传文件------------------------------------------------
/**
* 上传单个文件
*Stream 方式
* @param srcFileStream
* @param name
* @throws Exception
*/
public void uploadFile(final InputStream srcFileStream, final String name) {
new Thread(new Runnable() {
@Override
public void run() {
try {
File file = new File( name );
mFtpClient.setFileType(FTP.BINARY_FILE_TYPE); //图片支持二进制上传 如果采用ASCII_FILE_TYPE(默认),虽然上传后有数据,但图片无法打开
boolean status = mFtpClient.storeFile(name, srcFileStream);
srcFileStream.close();
} catch (Exception e) {
Log.i(TAG, "run: "+e.toString());
}
}
}).start();
}
/**
* 上传单个文件 URI
*URI 方式
* @param uri
* @param name
* @throws Exception
*/
public void uploadFile(String uri, String name) throws Exception {
try {
File file = new File(uri);
mFtpClient.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);
FileInputStream srcFileStream = new FileInputStream(file);
boolean status = mFtpClient.storeFile(name, srcFileStream);
Log.e("Status", String.valueOf(status));
srcFileStream.close();
} catch (Exception e) {
throw e;
}
}
/**
* FTP上传文件
* filePathName 文件路径方式
* @param filePathName
* @return
*/
public boolean ftpUploadFile(String filePathName){
boolean result = false;
try {
File file = new File( filePathName );
Log.i(TAG, "doInBackground: " + file.getPath());
String dataDirectory = file.getName().substring(0,8);
Log.i(TAG, "ftpUploadFile: "+dataDirectory);
if (file.exists()) {
FileInputStream fileInputStream = new FileInputStream(file);
uploadDirectoryFile(fileInputStream, dataDirectory, file.getName());
Log.i(TAG, "ftpUploadFile: Upload Successful");
result = true; //上传成功
} else {
Log.i(TAG, "ftpUploadFile: 文件路径不存在");
}
} catch (Exception e) {
Log.i(TAG, "ftpUploadFile: "+"Failure : " + e.getLocalizedMessage());
}
return result ;
}
/**
* 上传文件夹
*文件流 上传后指定根目录 文件名称
* @param srcFileStream 文件流
* @param directoryName ftp存储的文件夹名称
* @param name ftp存储的文件名称
* @throws Exception
*/
public void uploadDirectoryFile(InputStream srcFileStream, String directoryName, String name) throws Exception {
try {
mFtpClient.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);
//判断当前FTP工作目录
String pwd = mFtpClient.printWorkingDirectory();
if(pwd!=null){
if(!("/"+Constant.ftpDirectoryFile).equals(pwd)){
getDirectoryExist(Constant.ftpDirectoryFile);
}
}
Log.i(TAG, "uploadDirectoryFile:当前工作目录--前- "+pwd);
getDirectoryExist(directoryName);
mFtpClient.storeFile(name, srcFileStream);
String pwd2 = mFtpClient.printWorkingDirectory();
Log.i(TAG, "uploadDirectoryFile:当前工作目录--中- "+pwd2);
changeToParentDirectory();
String pwd1 = mFtpClient.printWorkingDirectory();
Log.i(TAG, "uploadDirectoryFile:当前工作目录--后- "+pwd1);
srcFileStream.close();
} catch (Exception e) {
throw e;
}
}
// -------------------------------------------------------文件下载方法------------------------------------------------
/**
* 下载单个文件,可实现断点下载.
*
* @param serverPath Ftp目录及文件路径(文件夹+文件名)
*
* @param localPath 本地目录文件夹目录(文件夹)
*
* @param fileName 下载之后的文件名称(文件名)
*
* @param listener 监听器
*
* @throws IOException
*/
public void downloadSingleFile(String serverPath, String localPath, String fileName, FtpProgressListener listener) throws Exception {
listener.onFtpProgress(Constant.FTP_CONNECT_SUCCESS, 0, null);
// 先判断服务器文件是否存在
FTPFile[] files = mFtpClient.listFiles(serverPath);
if (files!=null &&files.length == 0) {
listener.onFtpProgress(Constant.FTP_FILE_NOTEXISTS, 0, null);
return;
}
// 创建本地文件夹
File mkFile = new File(localPath);
if (!mkFile.exists()) {
boolean ismake=mkFile.mkdirs();
Log.i(TAG,"是否存在"+ismake);
}
localPath = localPath + File.separator+fileName;
// 接着判断下载的文件是否能断点下载
long serverSize = files[0].getSize(); // 获取远程文件的长度
File localFile = new File(localPath);
long localSize = 0;
if (localFile.exists()) {
localSize = localFile.length(); // 如果本地文件存在,获取本地文件的长度
if (l
评论0