ftp上传下载 java FTPClient


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

一, 安装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、以后再上传中文文件,就不会出现乱码问题啦。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值