zoukankan      html  css  js  c++  java
  • springmvc+mybatis+html 下将查询数据以excell形式上传到ftp(下)

    上节讲到的是从数据库中查询相应的结果以excell形式写到ftp服务器上,今天又试了试从ftp上将excell 文件下载到本地目录,一开始的时候遇到了中文乱码问题,文件名中含有中文下载下来文件名为乱码,以下贴出核心代码

      1 package com.ninefbank.smallpay.admin.util;
      2 
      3 import java.io.BufferedOutputStream;
      4 import java.io.File;
      5 import java.io.FileInputStream;
      6 import java.io.FileOutputStream;
      7 import java.io.IOException;
      8 import java.io.OutputStream;
      9 
     10 import org.apache.commons.lang3.StringUtils;
     11 import org.apache.commons.net.ftp.FTPClient;
     12 import org.apache.commons.net.ftp.FTPClientConfig;
     13 import org.apache.commons.net.ftp.FTPFile;
     14 import org.apache.commons.net.ftp.FTPReply;
     15 import org.slf4j.Logger;
     16 import org.slf4j.LoggerFactory;
     17 
     18 import com.jcraft.jsch.Channel;
     19 import com.jcraft.jsch.ChannelSftp;
     20 import com.jcraft.jsch.JSch;
     21 import com.jcraft.jsch.Session;
     22 import com.ninefbank.smallpay.admin.common.Ftp;
     23 import com.ninefbank.smallpay.common.util.DateUtil;
     24 import com.ninefbank.smallpay.common.vo.FtpRequest;
     25 
     26 public class FtpUtils {
     27     private static Logger logger = LoggerFactory.getLogger(FtpUtils.class);
     28     private static FTPClient ftp;
     29     private static String LOCAL_CHARSET = "GBK";
     30     
     31     
     32     /* 获取ftp连接
     33      * @param f
     34      * @return
     35      * @throws Exception
     36      */
     37     public static boolean connectFtp(Ftp f) throws Exception{
     38         ftp=new FTPClient();
     39         boolean flag=false;
     40         int reply;
     41         if (f.getPort()==null) {
     42             ftp.connect(f.getIpAddr(),21);
     43         }else{
     44             ftp.connect(f.getIpAddr(),f.getPort());
     45         }
     46         ftp.login(f.getUserName(), f.getPwd());
     47         ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
     48         reply = ftp.getReplyCode();      
     49         if (!FTPReply.isPositiveCompletion(reply)) {      
     50               ftp.disconnect();      
     51               return flag;      
     52         }      
     53         ftp.changeWorkingDirectory(f.getPath());      
     54         flag = true;      
     55         return flag;
     56     }
     57      /* 下载链接配置
     58       * @param f
     59       * @param localBaseDir 本地目录
     60       * @param remoteBaseDir 远程目录
     61       * @throws Exception
     62       */
     63      public static void startDown(Ftp f,String localBaseDir,String remoteBaseDir ,FtpRequest reqs) throws Exception{
     64          if (FtpUtils.connectFtp(f)) {
     65              
     66              try { 
     67                  String ip = reqs.getIp();
     68                  int port = Integer.parseInt(reqs.getPort());
     69                  String userName = reqs.getUserName();
     70                  String userPwd = reqs.getPwd();
     71                  String path = reqs.getDownloadPath();
     72                  String fileName = reqs.getFileName();
     73                  String localPath = reqs.getLocalPath();
     74                  FTPFile[] files = null; 
     75                  FTPClient ftpClient = new FTPClient();
     76                  ftpClient.connect(ip, port);
     77                  // 登录
     78                  ftpClient.login(userName, userPwd);
     79                  // 设置传输协议
     80                  ftpClient.setRemoteVerificationEnabled(false);
     81                  ftpClient.enterLocalPassiveMode();
     82                  ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
     83                  ftpClient.setListHiddenFiles(true);
     84 //                 ftpClient.configure(new FTPClientConfig(FTPClientConfig.SYST_UNIX)); 
     85                  if (FTPReply.isPositiveCompletion(ftpClient.sendCommand(
     86                          "OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
     87                          LOCAL_CHARSET = "UTF-8";
     88                          }
     89                  ftpClient.setControlEncoding(LOCAL_CHARSET);
     90                  boolean changedir = ftpClient.changeWorkingDirectory(remoteBaseDir); 
     91                  if (changedir) { 
     92                      
     93                      
     94 //                     ftp.setControlEncoding("GBK"); 
     95                       
     96                      files = ftpClient.listFiles(); 
     97                      for (int i = 0; i < files.length; i++) { 
     98                          try{ 
     99                              if(fileName.equals(files[i].getName())){
    100                                  downloadFile(ftpClient,files[i], localBaseDir, remoteBaseDir); 
    101                              }
    102                              
    103                          }catch(Exception e){ 
    104                              logger.error("异常信息:"+e); 
    105                              logger.error("<"+files[i].getName()+">下载失败"); 
    106                          } 
    107                      } 
    108                  } 
    109              } catch (Exception e) { 
    110                  logger.error("异常信息:"+e); 
    111                  logger.error("下载过程中出现异常"); 
    112              } 
    113          }else{
    114              logger.error("链接失败!");
    115          }
    116          
    117      }
    118      
    119      
    120      /** 
    121       * 
    122       * 下载FTP文件 
    123       * 当你需要下载FTP文件的时候,调用此方法 
    124       * 根据<b>获取的文件名,本地地址,远程地址</b>进行下载 
    125       * 
    126       * @param ftpFile 
    127       * @param relativeLocalPath 
    128       * @param relativeRemotePath 
    129       */ 
    130      private  static void downloadFile(FTPClient ftpClient,FTPFile ftpFile, String relativeLocalPath,String relativeRemotePath) { 
    131          if (ftpFile.isFile()) {
    132              if (ftpFile.getName().indexOf("?") == -1) { 
    133                  OutputStream outputStream = null; 
    134                  try { 
    135                       String f= new String(ftpFile.getName().getBytes("GBK"), "iso-8859-1");  
    136                      File locaFile= new File(relativeLocalPath+ ftpFile.getName()); 
    137                      //判断文件是否存在,存在则返回 
    138                      if(locaFile.exists()){ 
    139                          return; 
    140                      }else{ 
    141                          outputStream = new FileOutputStream(relativeLocalPath+ ftpFile.getName()); 
    142                          ftpClient.retrieveFile(new String(ftpFile.getName().getBytes("GBK"),"ISO-8859-1"), outputStream); 
    143                          outputStream.flush(); 
    144                          outputStream.close(); 
    145                      } 
    146                  } catch (Exception e) { 
    147                      logger.error("异常信息:"+e);
    148                  } finally { 
    149                      try { 
    150                          if (outputStream != null){ 
    151                              outputStream.close(); 
    152                          }
    153                      } catch (IOException e) { 
    154                         logger.error("输出文件流异常"); 
    155                      } 
    156                  } 
    157              } 
    158          }
    159      } 
    160     
    161 }

    调用处:

    FtpUtils.uploadFTP(req);
    Ftp f=new Ftp();
    f.setIpAddr(DataBaseConst.FTP_FEE_IP);
    f.setUserName(DataBaseConst.FTP_FEE_USERNAME);
    f.setPwd(DataBaseConst.FTP_FEE_PASSWORD);

    String ftpPath = DataBaseConst.FTP_FEE_PATH + newFilePath + currDate8 + "/";

    FtpRequest req = new FtpRequest();
    req.setIp(DataBaseConst.FTP_FEE_IP);
    req.setPort(DataBaseConst.FTP_FEE_PORT);
    req.setUserName(DataBaseConst.FTP_FEE_USERNAME);
    req.setPwd(DataBaseConst.FTP_FEE_PASSWORD);
    req.setDownloadPath(DataBaseConst.FTP_FEE_PATH + newFilePath);
    req.setFileName(branchFileName);
    req.setLocalPath(localPath);

    FtpUtils.startDown(f, "e:/", ftpPath,req);

    代码我也没怎么优化,我贴这也是为了提醒自己下载的时候乱码怎么解决

  • 相关阅读:
    JAVA-初步认识-第五章-数组-常见操作-最值2
    JAVA-初步认识-第五章-数组-常见操作-最值
    JAVA-初步认识-第五章-数组-常见操作-遍历
    JAVA-初步认识-第五章-数组-第二种定义格式
    JAVA-初步认识-第四章-数组-常见问题
    JAVA-初步认识-第四章-内存图解
    日期加1程序
    发生了COMException 异常来自 HRESULT:0x80040228
    设置窗体的可见性无效
    DotNetBar RibbonControl 控件动态添加项
  • 原文地址:https://www.cnblogs.com/sailormoon/p/6958658.html
Copyright © 2011-2022 走看看