关于FTP远程和服务器通信建立连接、增加、删除、下载、预览图片功能

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

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180713G116S300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券