ftp上传下载 java FTPClient (zhuan)
项目需要,网上搜了搜,很多,但问题也不少,估计转来转去,少了不少东西,而且也情况也不太一样。没办法,只能自己去写一个。
- 一, 安装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)的更多相关文章
- 简单的FTP上传下载(java实现 swing界面)
/** *阅读前请自己在win7上建立FTP主机 *具体步骤如:http://jingyan.baidu.com/article/574c5219d466c36c8d9dc138.html * 然后将 ...
- JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)
package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...
- Java.ftp上传下载
1:jar的maven的引用: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...
- java客户端调用ftp上传下载文件
1:java客户端上传,下载文件. package com.li.utils; import java.io.File; import java.io.FileInputStream; import ...
- 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)
前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上 ...
- ftp上传下载工具类
package com.taotao.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNo ...
- windows系统下ftp上传下载和一些常用命令
先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...
- windows下ftp上传下载和一些常用命令
先假设一个ftp地址 用户名 密码 FTP Server: home4u.at.china.com User: yepanghuang Password: abc123 打开windows的开始菜单, ...
- FTP上传下载工具(FlashFXP) v5.5.0 中文版
软件名称: FTP上传下载工具(FlashFXP) 软件语言: 简体中文 授权方式: 免费试用 运行环境: Win 32位/64位 软件大小: 7.4MB 图片预览: 软件简介: FlashFXP 是 ...
随机推荐
- OC导入框架方式#import、@import的区别
#import负责导入程序所需的文件的信息导入到程序中,随着程序所需的文件越来越多,程序就要导入更多的文件,这就带来了越来越长的编译时间,而且有大量重复的.为了解决这个问题可以采用以下办法解决,创建. ...
- Adaptive Execution如何让Spark SQL更高效更好用
1 背 景 Spark SQL / Catalyst 和 CBO 的优化,从查询本身与目标数据的特点的角度尽可能保证了最终生成的执行计划的高效性.但是 执行计划一旦生成,便不可更改,即使执行过程中发 ...
- Scalability, Availability & Stability Patterns
https://blog.csdn.net/ajian005/article/details/6191814 一 自我有要求的读者应该提出问题:(研习:掌握层次:)能力级别:不会(了解)——领会( ...
- css float 浮动是个混球
得说,在学习 CSS 的时候就一直在疑惑,横排布局干嘛要用 float 这种属性, 用了还会高度塌陷,怎么不发明些高级点的属性来完成横排布局呢, 甚至所有人都告诉我摒弃表格布局,浮动布局才是 DIV+ ...
- MapReduce-读取HBase
MapReduce读取HBase数据 代码如下 package com.hbase.mapreduce; import java.io.IOException; import org.apache.h ...
- C# 关于 上传文件 大小限制问题
<system.web> <compilation debug="true" targetFramework="4.5" /> < ...
- Effective java第一章引言
菜鸟一枚,开始读第一本书<Effective Java>(第二版)~ 看引言就有好多名词不懂(>_<) 导出的API由所有可在定义该API的包之外访问的API元素组成.一个包的 ...
- c++ Const关键字
转自:http://blog.csdn.net/Eric_Jo/article/details/4138548 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根 ...
- ADO.NET入门教程(一) 初识ADO.NET
摘要 作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角色.本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET的主要组成部分 ...
- eclispe中使用 maven build启动maven项目和打包项目
1.右键项目2.点击run as按钮 3.点击run configurations 4.配置如下: =============================加油加油加油加油加油加油========= ...