FTP上传文件名称中文乱码问题

这个问题昨天研究了一下午,以为解决了,今天早上突然发现其实并没有解决,所以花了一早上时间又查阅了相关资料后 现在才算彻底的解决。要注意:昨天我单纯的把filename转成new String(filename.getBytes("GBK"), "ISO-8859-1"),的确发现上传后中文不再乱码了,于是我以为我把这个问题解决了,但是后来发现如果ftp服务器中的设置就已经是utf-8的编码的话还是会继续报错的,所以我又上网找了些资料发现有个命令可以设置ftp支持UTF-8,就是这个ftpClient.sendCommand("OPTS UTF8", "ON"),所以就试了一下然后文件名字这样new String(filename.getBytes(LOCAL_CHARSET), SERVER_CHARSET),喏,这回乱码问题彻底解决了,下面是代码:

public class FTPFileUtil {
          //此为FTP的配置文件信息
	 static Map<String, String> eip = UtilProperties.getPropretiesByKey();
	 //本地字符编码
	  static String LOCAL_CHARSET = "GBK";
	  
	 // FTP协议里面,规定文件名编码为iso-8859-1
	  static String SERVER_CHARSET = "ISO-8859-1";
	 
	 public static FTPClient ftpClient = null;
     
	 /***
	  *  初始化ftp服务器
	  * @author panfei
	  * @date 2018年7月18日
	  */
     public static void initFtpClient() {
        ftpClient = new FTPClient();
        try {
            ICFLoggerUtils.info("connecting...ftp服务器:"+ eip.get("ftp.username") +":"+ eip.get("ftp.port")); 
        	//连接ftp服务器
            ftpClient.connect(eip.get("ftp.uploadpath"), Integer.valueOf(eip.get("ftp.port"))); 
            //登录ftp服务器
            ftpClient.login(eip.get("ftp.username"), eip.get("ftp.password")); 
            //是否成功登录服务器
            int replyCode = ftpClient.getReplyCode(); 
            if(!FTPReply.isPositiveCompletion(replyCode)){
            	ICFLoggerUtils.info("connect failed...ftp服务器:"+eip.get("ftp.username")+":"+eip.get("ftp.port")); 
            }
            ICFLoggerUtils.info("connect success...ftp服务器:"+eip.get("ftp.username")+":"+eip.get("ftp.port")); 
            // 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
            		LOCAL_CHARSET = "UTF-8";
    		}
            ftpClient.setControlEncoding(LOCAL_CHARSET);
        }catch (MalformedURLException e) { 
           e.printStackTrace(); 
        }catch (IOException e) { 
           e.printStackTrace(); 
        } 
     }
	 
	/*****
	 * 上传ftp服务器
	 * @param pathname FTP服务器保存目录
	 * @param fis 流
	 * @param filename  要删除的文件名称
	 * @return 
	 * @author panfei
	 * @date 2018年7月18日
	 */
	  public static boolean createFile(String pathname, InputStream fis, String filename){
         boolean flag = false;
		 try {
			 ICFLoggerUtils.info("开始上传文件");
	         initFtpClient();
	         ftpClient.makeDirectory(pathname);
	         ftpClient.enterLocalPassiveMode();
	         ftpClient.changeWorkingDirectory(pathname);
	         ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
	         flag  = ftpClient.storeFile(new String(filename.getBytes(LOCAL_CHARSET),
	        		 SERVER_CHARSET), fis);
			if(flag){
				ICFLoggerUtils.info("文件上传成功!");
			}else{
				ICFLoggerUtils.info("文件上传不成功!");
			}
			fis.close();
            ftpClient.logout();
		} catch (Exception e1) {
			ICFLoggerUtils.info("上传文件失败");
			e1.printStackTrace();
		}finally {
			if(ftpClient.isConnected()){ 
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            } 
            if(null != fis){
                try {
                	fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } 
            } 
		}
		return flag; 
	}
	  
	/***
	 * 删除文件
	 * @param pathname FTP服务器保存目录 * 
     * @param filename 要删除的文件名称 *
	 * @return 
	 * @author panfei
	 * @date 2018年7月18日
	 */
    public static boolean deleteFile(String pathname, String filename){ 
        boolean flag = false; 
        try { 
        	ICFLoggerUtils.info("开始删除文件");
            initFtpClient();
            ftpClient.enterLocalPassiveMode(); 
            //切换FTP目录 
            ftpClient.changeWorkingDirectory(pathname); 
            flag = ftpClient.deleteFile(new String(filename.getBytes(LOCAL_CHARSET),
            		SERVER_CHARSET));
            ftpClient.logout();
        	if(flag){
				ICFLoggerUtils.info("删除文件成功!");
			}else{
				ICFLoggerUtils.info("删除文件失败!");
			}  
        } catch (Exception e) { 
        	ICFLoggerUtils.info("删除文件失败");
            e.printStackTrace(); 
        } finally {
            if(ftpClient.isConnected()){ 
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            } 
        }
        return flag; 
    }
    
     
	public static void main(String[] args) throws IOException {
		//InputStream  inputStream  = new FileInputStream("C:/Users/icfjk888/Workspaces/ICFInterfaceSrever-3.0/src/main/webapp/download/木兰.zip");
                //createFile("tempDownload",inputStream,"木兰.zip");
                //deleteFile("tempDownload", "木兰.zip");
	}
}

 打印结果:

 

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值