您的位置:首页 > 运维架构 > Apache

apache ftp 实现上传下载功能

2016-12-22 09:16 369 查看
      利用ftp实现服务器资源的上传,下载,这个需求是非常常见的,在这里主要介绍apache的ftp工具类的使用。

之前在项目中有发现,代码实现了ftp上传下载功能,不过是利用了sun 自带的 net.ftp工具,大概看了一下实现方法,感觉并没有apache的ftp那么简练,且不支持jdk1.7以上版本,jdk1.7之后变成了抽象类,需要换一种方式去new  ftpClient对象,不在这里深究sun的ftp,直接换成了apache的ftp工具类。

其实代码都比较好找,千遍一律,所以介绍本机的ftp连接测试;(对本机设ftp站点有兴趣的可以看看)

第一步:为本机搭建ftp服务器(win10)

控制面板 --  程序 -- 点击启用或关闭windows功能 -- 打开第四项internet information services,将ftp服务器全部勾选上,在去开始搜索IIS

找到网站,右键添加ftp站点,填了自己本机的ip后,可以选择它的一些权限控制,可以选择匿名登录,没有密码的那种,访问权限为所有用户。

可以测试一下,在浏览器输入ftp://ipxxx,如何成功访问你设置的ftp路径就Ok了



第二步:代码连接ftp(匿名用户,没有权限上传!!!)

第三步:以下代码都没有问题,但是经常性会有无法下载或者上传的问题;这边总结以下可能出现的原因:

1、设置了匿名登录的,这个其实就是一个坑,匿名登录ftp默认就是没有权限上传的,只有下载的权限,本人也不知道怎么加权限给匿名,理论上是改不了的;

2、添加ftp站点的时候,那就只能设置一个非匿名的,推荐设置一个指定用户,没有设置过指定用户就自己为电脑添加一个用户,推荐设置成你开机登录的用户名;

3、还用不了,那建议关掉电脑防火墙,这个是下下之策

public class FtpUtils {

private static FTPClient ftpClient = new FTPClient();

private static String encoding = System.getProperty("file.encoding");

/**

* Description: 向FTP服务器上传文件

*

* @Version1.0

* @param url

* FTP服务器hostname

* @param port

* FTP服务器端口

* @param username

* FTP登录账号

* @param password

* FTP登录密码

* @param path

* FTP服务器保存目录,如果是根目录则为“/”

* @param filename

* 上传到FTP服务器上的文件名

* @param input

* 本地文件输入流

* @return 成功返回true,否则返回false

*/

public static boolean uploadFile(String url, int port, String username, String password, String path, String filename, InputStream input)

{

boolean result = false;

try

{

int reply;

// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器

// ftpClient.connect(url);

ftpClient.connect(url, port);// 连接FTP服务器

// 登录

// ftpClient.login(username, password);

ftpClient.setControlEncoding(encoding);

// 检验是否连接成功

reply = ftpClient.getReplyCode();

System.out.println(reply);

if (!FTPReply.isPositiveCompletion(reply))

{

System.out.println("连接失败");

ftpClient.disconnect();

return result;

} else {

System.out.println("连接success!");

// throw new NullPointerException();

}

// 转移工作目录至指定目录下

boolean change = ftpClient.changeWorkingDirectory(path);

ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

if (change)

{

result = ftpClient.storeFile(new String(filename.getBytes(encoding), "iso-8859-1"), input);

if (result)

{

System.out.println("上传成功!");

}

}

input.close();

ftpClient.logout();

} catch (IOException e)

{

System.out.println("--------");

e.printStackTrace();

} finally

{

if (ftpClient.isConnected())

{

try

{

ftpClient.disconnect();

} catch (IOException ioe)

{

}

}

}

return result;

}

/**

* 将本地文件上传到FTP服务器上

*

*/

public void testUpLoadFromDisk()

{

try

{

FileInputStream in = new FileInputStream(new File("E:/ftp.txt"));

//这里ftp服务器如果设置了匿名登录,密码和用户名需要填了一个空字符串,不然会连接失败(需要密码登录的就正常填密码就行)

boolean flag = uploadFile("xxxx", 21, "", "", "/", "ftp.txt", in);

System.out.println(flag);

} catch (FileNotFoundException e)

{

e.printStackTrace();

}

}

/**

*

* Description: 从FTP服务器下载文件

*

* @param url

* FTP服务器hostname

* @param port

* FTP服务器端口

* @param username

* FTP登录账号

* @param password

* FTP登录密码

* @param remotePath

* FTP服务器上的相对路径

* @param fileName

* 要下载的文件名

* @param localPath

* 下载后保存到本地的路径

* @return

*/

public static boolean downFile(String url, int port, String username, String password, String remotePath, String fileName, String localPath)

{

boolean result = false;

try

{

int reply;

ftpClient.setControlEncoding(encoding);

/*

* 为了上传和下载中文文件,有些地方建议使用以下两句代替

* new String(remotePath.getBytes(encoding),"iso-8859-1")转码。

* 经过测试,通不过。

*/

// FTPClientConfig conf = new

// FTPClientConfig(FTPClientConfig.SYST_NT);

// conf.setServerLanguageCode("zh");

ftpClient.connect(url, port);

// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器

ftpClient.login(username, password);// 登录

// 设置文件传输类型为二进制

ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

// 获取ftp登录应答代码

reply = ftpClient.getReplyCode();

// 验证是否登陆成功

if (!FTPReply.isPositiveCompletion(reply))

{

ftpClient.disconnect();

System.err.println("FTP server refused connection.");

return result;

}

// 转移到FTP服务器目录至指定的目录下

ftpClient.changeWorkingDirectory(new String(remotePath.getBytes(encoding), "iso-8859-1"));

// 获取文件列表

FTPFile[] fs = ftpClient.listFiles();

for (FTPFile ff : fs)

{

if (ff.getName().equals(fileName))

{

File localFile = new File(localPath + "/" + ff.getName());

OutputStream is = new FileOutputStream(localFile);

ftpClient.retrieveFile(ff.getName(), is);

is.close();

}

}

ftpClient.logout();

result = true;

} catch (IOException e)

{

e.printStackTrace();

} finally

{

if (ftpClient.isConnected())

{

try

{

ftpClient.disconnect();

} catch (IOException ioe)

{

}

}

}

return result;

}

/**

* 将FTP服务器上文件下载到本地

*/

public void testDownFile()

{

try

{

boolean flag = downFile("127.0.0.1", 21, "zlb", "123", "/", "contact.txt", "D:/");

System.out.println(flag);

} catch (Exception e)

{

e.printStackTrace();

}

}

public static void main(String[] args)

{

FtpUtils fa = new FtpUtils();

fa.testUpLoadFromDisk();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java