apache ftp 实现上传下载功能

      利用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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。 首先,我们可以使用 Spring Security 实现登录功能。Spring Security 是 Spring 框架中的安全框架,可以为我们提供一系列的安全服务,包括认证、授权、攻击防护等。 其次,我们可以使用 Apache Commons Net 库实现 FTP 文件上传下载功能。该库提供了一系列的 FTP 操作工具类,可以方便地实现 FTP 文件的上传和下载。 下面是一个简单的示例代码: ``` // 登录功能 @RequestMapping(value = "/login", method = RequestMethod.POST) public String login(@RequestParam String username, @RequestParam String password, HttpSession session) { // 验证用户名密码 if (username.equals("admin") && password.equals("123456")) { // 登录成功 session.setAttribute("user", username); return "redirect:/index"; } else { // 登录失败 return "login"; } } // 文件上传功能 @RequestMapping(value = "/upload", method = RequestMethod.POST) public String upload(@RequestParam("file") MultipartFile file) { // 获取文件名 String fileName = file.getOriginalFilename(); // 创建 FTP 客户端对象 FTPClient ftpClient = new FTPClient(); try { // 连接 FTP 服务器 ftpClient.connect("ftp.example.com", 21); // 登录 FTP 服务器 ftpClient.login("username", "password"); // 切换到上传目录 ftpClient.changeWorkingDirectory("/upload"); // 设置上传文件的类型为二进制类型 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 上传文件 ftpClient.storeFile(fileName, file.getInputStream()); } catch (IOException e) { e.printStackTrace(); } finally { try { // 关闭 FTP 客户端连接 ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } return "redirect:/index"; } // 文件下载功能 @RequestMapping(value = "/download", method = RequestMethod.GET) public void download(HttpServletResponse response) { // 创建 FTP 客户端对象 FTPClient ftpClient = new FTPClient(); try { // 连接 FTP 服务器 ftpClient.connect("ftp.example.com", 21); // 登录 FTP 服务器 ftpClient.login("username", "password"); // 切换到下载目录 ftpClient.changeWorkingDirectory("/download"); // 设置下载文件的类型为二进制类型 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 获取文件名 String fileName = "example.txt"; // 获取文件输入流 InputStream inputStream = ftpClient.retrieveFileStream(fileName); // 设置响应头 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); // 获取响应输出流 OutputStream outputStream = response.getOutputStream(); // 将文件内容写入响应输出流 byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } // 关闭文件输入流和响应输出流 inputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { // 关闭 FTP 客户端连接 ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } ``` 需要注意的是,FTP 服务器的地址、端口、用户名、密码、上传下载目录等参数需要根据实际情况进行修改。另外,为了避免 FTP 客户端连接泄漏,我们需要在 finally 代码块中关闭 FTP 客户端连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值