资源描述
项目需要,网上搜了搜,很多,但问题也不少,估计转来转去,少了不少东西,而且也情况也不太一样。没办法,只能自己去写一个。一, 安装sserv-u ftp服务器 版本10.1.0.1 我所设服务器配置:用户名:shiyanming密码:123端口:21跟目录:D:/ftpindex二、所需jar包:common-net-1.4.1.jarjakarta-oro-2.0.8.jar 注意:第二个jar包必须要存在,不然在列举ftp服务器中文件是出错 三、中文传输问题 四、具体程序 com.ftp. SeforgeFtpUtils.javapackage 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 .URLEncoder;import javax.servlet.http.HttpServletResponse;import .ftp.FTP;import .ftp.FTPClient;import .ftp.FTPClientConfig;import .ftp.FTPFile;import .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 = fsi; 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 = fsi; 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:ftpindexold.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、以后再上传中文文件,就不会出现乱码问题啦
展开阅读全文