springMVC+FTP上传下载文件夹及文件

/**
 *
 * @author wbqiang
 * FTP操作工具类     创建时间 20170104
 */
public class FTPUtil {
    
    private String userName;     //登录名
    private String password;     //密码
    private String ftpHostName;  //ftp地址
    private int port = 21;       //端口
    private FTPClient ftpClient = new FTPClient();
    private OutputStream os = null;
    private InputStream is = null;
    private static Logger logger = Logger.getLogger(FTPUtil.class);
    
    private Pattern pattern = Pattern.compile("\\d{8}");    //8位数字
    
    public FTPUtil(String userName,String password,String ftpHostName,int port){
        super();
        this.userName = userName;
        this.password = password;
        this.ftpHostName = ftpHostName;
        this.port = port;
    }
    /**
     * 建立链接
     */
    private void connect(){
        try {
            logger.info("开始链接...");
            ftpClient.connect(ftpHostName, port);
            int reply = ftpClient.getReplyCode();   //ftp响应码
            if(!FTPReply.isPositiveCompletion(reply)){  //ftp拒绝链接
                logger.error("ftp拒绝链接...");
                ftpClient.disconnect();
            }
            ftpClient.login(userName, password);
            ftpClient.enterLocalPassiveMode();       //设置被动模式    通知server端开通端口传输数据
            ftpClient.setBufferSize(256);
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            ftpClient.setControlEncoding("utf-8");
            logger.info("登录成功!");
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            logger.error(e.getMessage(), e);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            logger.error(e.getMessage(), e);
        }
    }
    /**
     * 退出FTP登录关闭链接   并  关闭输入输出流
     * @param os
     */
    private void close(){
        try {
            if(is!=null){
                is.close();
            }
            if(os!=null){
                os.flush();
                os.close();
            }
            ftpClient.logout();
            logger.info("退出登录!");
            ftpClient.disconnect();
            logger.info("关闭链接!");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            logger.error(e.getMessage(), e);
        }
    }
    
    /**
     * 下载文件
     * @param ftpFileName    
     * @param downloadDate
     */
    public void downloadFiles(String ftpFileName,String downloadDate){
        connect();
        downloadFileByDate(ftpFileName,downloadDate);
        close();
    }
    
    /**
     * 下载指定文件
     * @param ftpFileName
     * @param downloadDate
     */
    private void downloadFileByDate(String ftpFileName,String downloadDate){
        try {
            if(isDir(ftpFileName)){        //文件夹
                String[] names = ftpClient.listNames();
                for(int i=0;i<names.length;i++){
                    System.out.println(names[i] + "--------------");
                    if(pattern.matcher(names[i]).matches()){   //如果是8位数字的文件夹
                        downloadFileByDate(ftpFileName + "/" + downloadDate,downloadDate);  //指定文件夹
                        ftpClient.changeToParentDirectory();
                        break;
                    }
                    if(isDir(names[i])){
                        downloadFileByDate(ftpFileName + "/" + names[i],downloadDate);
                        ftpClient.changeToParentDirectory();
                    }else{
                        is = ftpClient.retrieveFileStream(names[i]);     //取出文件转成输入流
                        zipByFile(ftpFileName+"/"+names[i],is);                             //压缩文件
                        //在retrieveFileStream后面加上completePendingCommand,changeWorkingDirectory才能正常输出
                        //而且completePendingCommand一定要在is.close()之后,否则容易程序死掉,坑爹啊;
                        ftpClient.completePendingCommand();  
                        //ftpClient.changeToParentDirectory();
                    }
//                    //测试
//                    if("04".equals(names[i])){
//                        break;
//                    }
                }
            } else {    //文件
                System.out.println(ftpFileName + "-------------------------");
                is = ftpClient.retrieveFileStream(ftpFileName);
                zipByFile(ftpFileName,is);                             //压缩文件
                ftpClient.completePendingCommand();
                ftpClient.changeToParentDirectory();
            }
            //os.flush();
            logger.info("下载成功!");
        } catch (IOException e) {
            logger.error("下载失败!",e);
        }
    }
    /**
     * @param ftpFileName
     */
    private void downloadFileOrDir(String ftpFileName){
        try {
            if(isDir(ftpFileName)){        //文件夹
                String[] names = ftpClient.listNames();
                for(int i=0;i<names.length;i++){
                    System.out.println(names[i] + "--------------");
                    if(isDir(names[i])){
                        downloadFileOrDir(ftpFileName + "/" + names[i]);
                        ftpClient.changeToParentDirectory();
                    }else{
                        File loadFile = new File(ftpFileName + File.separator
                                + names[i]);
                        os = new FileOutputStream(loadFile);
                        ftpClient.retrieveFile(names[i], os);
                    }
                }
            } else {    //文件
                File file = new File(ftpFileName);
                os = new FileOutputStream(file);
                ftpClient.retrieveFile(file.getName(), os);
                ftpClient.changeToParentDirectory();
            }
            logger.info("下载成功!");
        } catch (IOException e) {
            logger.error("下载失败!",e);
        }
    }
    
    /**
     * 判断是否是目录
     * @param fileName
     * @return
     */
    public boolean isDir(String fileName){
         try {
            // 切换目录,若当前是目录则返回true,否则返回true。
            boolean falg = ftpClient.changeWorkingDirectory(fileName);
            return falg;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            logger.error(e.getMessage(), e);
        }
         return false;
    }
    
    /**
     * 压缩文件
     */
    private void zipByFile(String fileName,InputStream is){
         try {
            // System.out.println(fileName+"==============");
            ((ZipOutputStream) os).putNextEntry(new ZipEntry(fileName));
             // 设置注释  
            //zip.setComment("hello");  
            int temp = 0;  
            while((temp = is.read()) != -1){  
                os.write(temp);  
            }  
            is.close();
            logger.info("压缩成功!");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            logger.error(e.getMessage(), e);
            
        } finally{
            try {
                if(is!=null){
                    is.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    
    public void uploadFile(String ftpPath,String fileName){
        connect();
        uploadFileByDo(ftpPath,fileName);
        close();
    }
    /**
     * 上传文件
     * @param ftpPath   FTP服务器保存目录
     * @param fileName  上传到FTP服务器上的文件名
     */
    private void uploadFileByDo(String ftpPath,String fileName){
        try {
            if(ftpClient.changeWorkingDirectory(ftpPath)){
                ftpClient.storeFile(fileName, is);
                is.close();
            }else{
                logger.info("上传FTP服务器路径有误!");
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            logger.error(e.getMessage(), e);
        } finally{
            try {
                if(is!=null){
                    is.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                logger.error(e.getMessage(), e);
            }
        }
    }

    public String getUserName() {
        return userName;
    }


    public void setUserName(String userName) {
        this.userName = userName;
    }


    public String getPassword() {
        return password;
    }


    public void setPassword(String password) {
        this.password = password;
    }


    public String getFtpHostName() {
        return ftpHostName;
    }


    public void setFtpHostName(String ftpHostName) {
        this.ftpHostName = ftpHostName;
    }


    public int getPort() {
        return port;
    }


    public void setPort(int port) {
        this.port = port;
    }
    
    public OutputStream getOs() {
        return os;
    }
    public void setOs(OutputStream os) {
        this.os = os;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //downloadFiles();
    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值