一, 安装filezilie-u ftp服务器
我所设服务器配置:
用户名:zst
密码:123456
端口:21
跟目录:D:/ftp
二、所需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上传工具,上传速度也很快,很好用的ftp上传工具,上传速度也很快,很好用的ftp上传工具,上传速度也很快,
教你如何用FTP上传网页到虚拟主机 fileZilla LeapFTP
可以实现ftp上传图片文件到指定ftp目录php实现通过ftp上传图片文件,用户无需手动更改目录,上传时可以选择是否上传到ftp位置,可有本地跟ftp可选
C++ libcurl ftp上传文件
c# 实现文件FTP上传至服务器 WebClient上传文件至服务器(不带进度条) 要上传的文件(全路径格式) <param name="strUrlDirPath">Web服务器文件夹路径 <returns>True/False是否上传成功</returns>
go 实现ftp上传资源 并且ftp 可以自动创建文件夹,如有不会直接私聊我 我会在第一时间为你解答。
FTP上传下载文件
FTP上传工具 论坛FTP 专用 上传工具
企业内部备份大文件,如数据库压缩文件超过30G,可能由于某些备份软件限制导致不能完全被ftp上传完,传后只有20多G,这样就失去了备份的意义,文件也无法被解压缩,针对此现状自己开发个小工具,经测试上传2G大小的...
一个PB开发的FTP上传与下载案例,绝对原创哦,自动升级程序
C#实现FTP上传、下载、删除文件,扫描(正则过滤)指定文件并上传 C#实现FTP上传、下载、删除文件,扫描(正则过滤)指定文件并上传
curl实现ftp上传下载,vs版本实现,可以使用
winform实现FTP上传、下载、删除文件。自己写的Demo,亲测可用!
ftp 文件上传 ftp上传图片
ftp 上传时,用到的工具类,项目上配置好ftp服务器后,controller可以方便的调用此工具类进行上传
FTP上传(断点续传)更新进度条 公司项目第一个版本
本程序在VS2010环境下进行开发,程序用C# WinForm实现了FTP上传下载(可实现上传所选目录下的所有文件)并带上传进度条,程序会在运行根目录下自动生成日志文件以方便查看信息...本程序主要由socket进行通信...程序由...
ftp上传工具上传ftp服务器,支持配置多个远程ftp服务器,支持配置运行时间间隔 同步。指定上传文件路径
虚拟主机上传器,ftp上传器.FTP上传工具、FTP软件、FTP下载工具
FTP上传和下载,可以通过本地和服务器之间建立间接,通过FTP方式进行文件操作等