项目需要,网上搜了搜,很多,但问题也不少,估计转来转去,少了不少东西,而且也情况也不太一样。没办法,只能自己去写一个。

  • 一,    安装sserv-u ftp服务器 版本10.1.0.1
  • 我所设服务器配置:
  • 用户名:shiyanming
  • 密码:123
  • 端口:21
  • 跟目录:D:/ftpindex
  • 二、所需jar包:common-net-1.4.1.jar
  • jakarta-oro-2.0.8.jar
  • 注意:第二个jar包必须要存在,不然在列举ftp服务器中文件是出错
  • 三、中文传输问题
  • 四、具体程序   com.ftp. SeforgeFtpUtils.java
  • package com.ftp;
  • import java.io.File;
  • import java.io.FileInputStream;
  • import java.io.FileNotFoundException;
  • import java.io.FileOutputStream;
  • import java.io.IOException;
  • import java.io.InputStream;
  • import java.io.OutputStream;
  • import java.net.URLEncoder;
  • import javax.servlet.http.HttpServletResponse;
  • import org.apache.commons.net.ftp.FTP;
  • import org.apache.commons.net.ftp.FTPClient;
  • import org.apache.commons.net.ftp.FTPClientConfig;
  • import org.apache.commons.net.ftp.FTPFile;
  • import org.apache.commons.net.ftp.FTPReply;
  • /**
  • * @author shiyanming
  • *
  • */
  • public class SeforgeFtpUtils {
  • /**
  • * 上传程序方法
  • *
  • */
  • public boolean uploadFile(String url, int port, String username,
  • String password, String path, String filename, InputStream input) {
  • // filename:要上传的文件
  • // path :上传的路径
  • // 初始表示上传失败
  • boolean success = false;
  • // 创建FTPClient对象
  • FTPClient ftp = new FTPClient();
  • try {
  • int reply;
  • // 连接FTP服务器
  • // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
  • ftp.connect(url, port);
  • // 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件
  • ftp.setControlEncoding("GBK");
  • FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
  • conf.setServerLanguageCode("zh");
  • // 登录ftp
  • ftp.login(username, password);
  • // 看返回的值是不是230,如果是,表示登陆成功
  • reply = ftp.getReplyCode();
  • // 以2开头的返回值就会为真
  • if (!FTPReply.isPositiveCompletion(reply)) {
  • ftp.disconnect();
  • System.out.println("连接服务器失败");
  • return success;
  • }
  • System.out.println("登陆服务器成功");
  • ftp.changeWorkingDirectory(path);// 转移到FTP服务器目录
  • FTPFile[] fs = ftp.listFiles(); // 得到目录的相应文件列表
  • System.out.println(fs.length);
  • System.out.println(filename);
  • String filename1 = SeforgeFtpUtils.changeName(filename, fs);
  • String filename2 = new String(filename1.getBytes("GBK"),
  • "ISO-8859-1");
  • String path1 = new String(path.getBytes("GBK"), "ISO-8859-1");
  • // 转到指定上传目录
  • ftp.changeWorkingDirectory(path1);
  • // 将上传文件存储到指定目录
  • // ftp.appendFile(new String(filename.getBytes("GBK"),"ISO-8859-1"),
  • // input);
  • ftp.setFileType(FTP.BINARY_FILE_TYPE);
  • //如果缺省该句 传输txt正常 但图片和其他格式的文件传输出现乱码
  • ftp.storeFile(filename2, input);
  • // 关闭输入流
  • input.close();
  • // 退出ftp
  • ftp.logout();
  • // 表示上传成功
  • success = true;
  • System.out.println("上传成功。。。。。。");
  • } catch (IOException e) {
  • e.printStackTrace();
  • } finally {
  • if (ftp.isConnected()) {
  • try {
  • ftp.disconnect();
  • } catch (IOException ioe) {
  • }
  • }
  • }
  • return success;
  • }
  • /**
  • * 删除程序
  • *
  • */
  • public boolean deleteFile(String url, int port, String username,
  • String password, String path, String filename) {
  • // filename:要上传的文件
  • // path :上传的路径
  • // 初始表示上传失败
  • boolean success = false;
  • // 创建FTPClient对象
  • FTPClient ftp = new FTPClient();
  • try {
  • int reply;
  • // 连接FTP服务器
  • // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
  • ftp.connect(url, port);
  • // 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件
  • ftp.setControlEncoding("GBK");
  • FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
  • conf.setServerLanguageCode("zh");
  • // 登录ftp
  • ftp.login(username, password);
  • // 看返回的值是不是230,如果是,表示登陆成功
  • reply = ftp.getReplyCode();
  • // 以2开头的返回值就会为真
  • if (!FTPReply.isPositiveCompletion(reply)) {
  • ftp.disconnect();
  • System.out.println("连接服务器失败");
  • return success;
  • }
  • System.out.println("登陆服务器成功");
  • String filename2 = new String(filename.getBytes("GBK"),
  • "ISO-8859-1");
  • String path1 = new String(path.getBytes("GBK"), "ISO-8859-1");
  • // 转到指定上传目录
  • ftp.changeWorkingDirectory(path1);
  • FTPFile[] fs = ftp.listFiles(); // 得到目录的相应文件列表
  • ftp.deleteFile(filename2);
  • ftp.logout();
  • success=true;
  • } catch (IOException e) {
  • System.out.println(e);
  • } finally {
  • if (ftp.isConnected()) {
  • try {
  • ftp.disconnect();
  • } catch (IOException ioe) {
  • }
  • }
  • }
  • return success;
  • }
  • /**
  • * 下载程序
  • *
  • */
  • public static boolean downFile(String ip, int port, String username,
  • String password, String remotePath, String fileName,
  • OutputStream outputStream, HttpServletResponse response) {
  • boolean success = false;
  • FTPClient ftp = new FTPClient();
  • try {
  • int reply;
  • ftp.connect(ip, port);
  • // 下面三行代码必须要,而且不能改变编码格式
  • ftp.setControlEncoding("GBK");
  • FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
  • conf.setServerLanguageCode("zh");
  • // 如果采用默认端口,可以使用ftp.connect(url) 的方式直接连接FTP服务器
  • ftp.login(username, password);// 登录
  • ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
  • reply = ftp.getReplyCode();
  • if (!FTPReply.isPositiveCompletion(reply)) {
  • ftp.disconnect();
  • return success;
  • }
  • System.out.println("登陆成功。。。。");
  • ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
  • FTPFile[] fs = ftp.listFiles(); // 得到目录的相应文件列表
  • // System.out.println(fs.length);//打印列表长度
  • for (int i = 0; i < fs.length; i++) {
  • FTPFile ff = fs[i];
  • if (ff.getName().equals(fileName)) {
  • String filename = fileName;
  • // 这个就就是弹出下载对话框的关键代码
  • response.setHeader("Content-disposition",
  • "attachment;filename="
  • + URLEncoder.encode(filename, "utf-8"));
  • // 将文件保存到输出流outputStream中
  • ftp.retrieveFile(new String(ff.getName().getBytes("GBK"),
  • "ISO-8859-1"), outputStream);
  • outputStream.flush();
  • outputStream.close();
  • }
  • }
  • ftp.logout();
  • success = true;
  • } catch (IOException e) {
  • e.printStackTrace();
  • } finally {
  • if (ftp.isConnected()) {
  • try {
  • ftp.disconnect();
  • } catch (IOException ioe) {
  • }
  • }
  • }
  • return success;
  • }
  • // 判断是否有重名方法
  • public static boolean isDirExist(String fileName, FTPFile[] fs) {
  • for (int i = 0; i < fs.length; i++) {
  • FTPFile ff = fs[i];
  • if (ff.getName().equals(fileName)) {
  • return true; // 如果存在返回 正确信号
  • }
  • }
  • return false; // 如果不存在返回错误信号
  • }
  • // 根据重名判断的结果 生成新的文件的名称
  • public static String changeName(String filename, FTPFile[] fs){
  • int n = 0;
  • // 创建一个可变的字符串对象 即StringBuffer对象,把filename值付给该对象
  • StringBuffer filename1 = new StringBuffer("");
  • filename1 = filename1.append(filename);
  • System.out.println(filename1);
  • while (isDirExist(filename1.toString(), fs)) {
  • n++;
  • String a = "[" + n + "]";
  • System.out.println("字符串a的值是:" + a);
  • int b = filename1.lastIndexOf(".");// 最后一出现小数点的位置
  • int c = filename1.lastIndexOf("[");// 最后一次"["出现的位置
  • if (c < 0) {
  • c = b;
  • }
  • StringBuffer name = new StringBuffer(filename1.substring(0, c));// 文件的名字
  • StringBuffer suffix = new StringBuffer(filename1.substring(b + 1));// 后缀的名称
  • filename1 = name.append(a).append(".").append(suffix);
  • }
  • return filename1.toString();
  • }
  • /**
  • * @param args
  • * @throws FileNotFoundException
  • *             测试程序
  • */
  • public static void main(String[] args) throws FileNotFoundException {
  • String path = "";
  • File f1 = new File("C:\\新.txt");
  • String filename = f1.getName();
  • System.out.println(filename);
  • //InputStream input = new FileInputStream(f1);
  • //SeforgeFtpUtils a = new SeforgeFtpUtils();
  • //a.uploadFile("172.25.5.193", 21, "shiyanming", "123", path, filename, input);
  • /*
  • * String path ="D:\\ftpindex\\"; File f2 = new
  • * File("D:\\ftpindex\\old.txt"); String filename2= f2.getName();
  • * System.out.println(filename2); SeforgeFtpUtils a = new
  • * SeforgeFtpUtils(); a.downFile("172.25.5.193", 21, "shi", "123", path,
  • * filename2, "C:\\");
  • */
  • SeforgeFtpUtils a = new SeforgeFtpUtils();
  • a.deleteFile("192.168.0.100", 21, "shiyanming", "123", path, filename);
  • }
  • }
  • 上边程序完成了文件的上传和下载
  • 重命名判断问题,如果重名,在后边加(n)。
  • 存在问题:如果jsp页面中读取from表单的值,只能获取主机的地址,不能上传客户端文件。
  • 3.1、 默认情况下,FtpClient使用的是UTF_8字符集作为服务器通讯的编码集。而FTP服务器SERV-U在windowsXP上,使用GBK字符集作为服务器通讯。
  • // 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件
  • ftp.setControlEncoding("GBK");
  • FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
  • conf.setServerLanguageCode("zh");
  • 3.2、同时还要设置服务器
  • 设置步骤:
  • 1、打开Serv-U 8.0控制台,点击“限制和设置”--“为域配置高级FTP命令设置和行为”。
  • 2、在FTP设置中找到OPTS UTF8命令,右击禁用此命令。3、点击下面的“全局属性”。
  • 4、在出来的FTP命令属性选项卡中,“高级选项”里,把“对所有收发的路径和文件名使用UFT-8编码”前面的钩去掉!
  • 5、以后再上传中文文件,就不会出现乱码问题啦。

ftp上传下载 java FTPClient (zhuan)的更多相关文章

  1. 简单的FTP上传下载(java实现 swing界面)

    /** *阅读前请自己在win7上建立FTP主机 *具体步骤如:http://jingyan.baidu.com/article/574c5219d466c36c8d9dc138.html * 然后将 ...

  2. JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)

    package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...

  3. Java.ftp上传下载

    1:jar的maven的引用: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  4. java客户端调用ftp上传下载文件

    1:java客户端上传,下载文件. package com.li.utils; import java.io.File; import java.io.FileInputStream; import ...

  5. 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)

    前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上 ...

  6. ftp上传下载工具类

    package com.taotao.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNo ...

  7. windows系统下ftp上传下载和一些常用命令

    先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...

  8. windows下ftp上传下载和一些常用命令

    先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...

  9. FTP上传下载工具(FlashFXP) v5.5.0 中文版

    软件名称: FTP上传下载工具(FlashFXP) 软件语言: 简体中文 授权方式: 免费试用 运行环境: Win 32位/64位 软件大小: 7.4MB 图片预览: 软件简介: FlashFXP 是 ...

随机推荐

  1. <script>放在head内和body内有什么区别

    加载的顺序不一样,你可以把HTML看成从上往下加载的. 例如在网速慢的情况下把js代码放在body底部用户会先看到网页结构,等js加载完成后才出现特效 区别简述: 在HTML body部分中的Java ...

  2. 教你在树莓派使用上RTC实时时钟,不用再担心断电后时间归零的问题,开机后自动同步RTC时钟!!!

    准备工作:1.系统建议使用官方最新的镜像文件 2.RTC时钟模块板(I2C接口)建议使用DS1307时钟模块,或者RTC时钟模块RTC时钟模块: 大家知道arduino的电平是5V,树莓派是3.3V, ...

  3. 递归实现N皇后问题

    其实是看到一位名为“活在二次元的伪触”的博主昨天还是前天写了篇这个题材的笔记,觉得有点意思,于是想自己来写写. 其实我发现上述那位同学写N皇后问题写得还不错,文末也会给出这位同学用通过递归的方法实现N ...

  4. java resources 红叉 Cannot change version of project facet Dynamic Web Module to 2.5

    在使用maven导入项目的时候,markers提示Cannot change version of project facet Dynamic Web Module to 2.5,不能将工程转换为2. ...

  5. juniper常用命令

    Juniper防火墙基本命令 get interface ethernet0/0  查看 端口 常用查看命令 Get int 查看接口配置信息 Get int ethx/x 查看指定接口配置信息  G ...

  6. JBOSS invoker GETSHELL(PHP版)

    <?php $target = @$argv[1]; $procotol = @$argv[2]; if ($argc < 2) { print "[-]:php Jboss.p ...

  7. 【转载】IntelliJ IDEA WEB项目的部署配置

    最近使用了一下IDEA,确实强大.在部署时出现了些问题.看了这篇文章,对ieda的一些部署配置有了些许了解,在此感谢原博.原文链接:http://blog.csdn.net/z69183787/art ...

  8. Spring data jpa 使用技巧记录

    软件152 尹以操 最近在用Springboot 以及Spring data jpa  ,使用jpa可以让我更方便的操作数据库,特开此帖记录使用jpa的一些小技巧. 一.使用spring data j ...

  9. html5笔记(标签)

    1.aside aside字面理解为“旁边”,在html5中范围更广一点,是跟主内容相关,但是又可以独立的内容 ,可以是广告.引用.侧边栏等等. html5站的例子就是新闻的内容页或者列表页,以列表页 ...

  10. 如何创建效率高sql-建立索引

      我们做开发的人员,虽说自己不是专业从事数据库方面研究的(如DBA),但很多时候,公司没有专门的DBA,所以拿到具体的项目中,整体的数据库设计都是开发人员自己写的,随着时间的推移,加上开发经验的增长 ...