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

  • 一,    安装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. 转:C语言嵌入式系统编程之软件架构篇

    http://blog.csdn.net/ce123_zhouwei/article/details/6978672

  2. $《第一行代码:Android》读书笔记——第10章 Android网络编程

    (一)WebView的用法 1.WebView也是一个普通的控件. 2.常用用法: WebView webView = (WebView)findViewById(R.id.web_view); we ...

  3. php任务管理器 —— Jobby

    通过一个主crontab任务去维护别的任务 自定义的计划任务完全由PHP编写 任务的执行计划时间表设置与crontab的时间表设置语法一致 在指定的时间内只会运行一个任务 邮件告警异常退出任务 在ro ...

  4. Shell 条件判断总结

    -b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目录,则为真 -e file 若文件存在,则为真 -f ...

  5. Django详解之四、cookie和session

    一.使用背景 思路 简单的后台管理:对人员的管理 1. 登录注册 2. 老师 班级管理 学院管理 3. 增删改查 开发: 1. 定义数据库表结构 a) 表结构关系 i. class classes(m ...

  6. 后向传播算法“backpropragation”详解

    为什么要使用backpropagation? 梯度下降不用多说,如果不清楚的可以参考梯度下降算法. 神经网络的参数集合theta,包括超级多组weight和bais. 要使用梯度下降,就需要计算每一个 ...

  7. RPC与HTTP

    一.为什么需要RPC,而不是简单的HTTP接口? RPC(即Remote Procedure Call,远程过程调用),主要是基于TCP/IP协议:而HTTP服务主要是基于HTTP协议的.我们都知道H ...

  8. 文件系统中跳转【TLCL】

    pwd - Print name of current working directory cd - Change directory ls - List directory contents Lin ...

  9. Hadoop心跳机制源码分析

    正文: 一.体系背景 首先和大家说明一下:hadoop的心跳机制的底层是通过RPC机制实现的,这篇文章我只介绍心跳实现的代码,对于底层的具体实现,大家可以参考我的另几篇博客: 1. hadoop的RP ...

  10. Linux内核之进程(1)

    进程:程序执行的一个实例,在Linux源代码中,常把进程称为任务(task)或者线程(thread). 从内核观点来看,进程的目的是担当分配系统资源(CPU的时间.内存等)的实体. 当一个进程创建时, ...