FTP文件上传下载删除_解决乱码.doc

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

一,    安装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;

 

importjavax.servlet.http.HttpServletResponse;

 

import org.apache.commons.net.ftp.FTP;

importorg.apache.commons.net.ftp.FTPClient;

importorg.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, intport, String username,

   String password, String path, Stringfilename, InputStream input) {

  //filename:要上传的文件

  //path :上传的路径

  // 初始表示上传失败

 boolean success = false;

  // 创建FTPClient对象

  FTPClientftp = 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(newString(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, intport, 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");

   Stringpath1 = 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, intport, 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(StringfileName, 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(Stringfilename, FTPFile[] fs){

  intn = 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) throwsFileNotFoundException {

 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文件上传下载删除_解决乱码.doc)