apache ftp 实现上传下载功能

来源:互联网 发布:淘宝卖的苍蝇水叫什么 编辑:程序博客网 时间:2024/05/18 00:48

      利用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();
}

}

0 0