sharpds77 发表于 2015-5-28 13:33:34

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;   

    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;   

   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、以后再上传中文文件,就不会出现乱码问题啦。
页: [1]
查看完整版本: ftp上传下载 java FTPClient