zoukankan      html  css  js  c++  java
  • FTP在docker容器中上传失败解决,改为被动模式

    package com.mayocase.takeout.utils;
    
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPReply;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import com.mayocase.takeout.user.rest.UserLoginController;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    
    /**
     * Created by laiwr on 2018/5/18.
     */
    @Component
    public class FtpUtils {
    
    	private static Logger logger = LoggerFactory.getLogger(UserLoginController.class);
    	
        @Autowired
        private FtpConfig ftpConfig;
    
        public FTPClient ftpClient = null;
    
        /**
         * 初始化链接文件
         */
        public void initFtpClient() {
            ftpClient = new FTPClient();
            ftpClient.setRemoteVerificationEnabled(false);									//取消服务器获取自身Ip地址和提交的host进行匹配,否则当不一致时会报异常。
            ftpClient.setControlEncoding("utf-8");											//在连接之前设置编码类型为utf-8
            try {
            	ftpClient.setDataTimeout(1000*120);											//设置传输超时时间为120秒
            	ftpClient.connect(ftpConfig.getHostname(), ftpConfig.getPort()); 			//连接ftp服务器
                ftpClient.login(ftpConfig.getUsername(), ftpConfig.getPassword()); 			//登录ftp服务器
                int replyCode = ftpClient.getReplyCode(); 									//是否成功登录服务器
                
                if(!FTPReply.isPositiveCompletion(replyCode)){
                	logger.warn("【initFtpClient】: 登录服务器失败");
                }            
                logger.warn("【initFtpClient】: 使用帐户:"+ftpConfig.getUsername()+"密码:"+ftpConfig.getPassword()+"登录ftp服务器:"+ftpConfig.getHostname()+":"+ftpConfig.getPort());
                logger.warn("【initFtpClient】: 成功登录服务器,被动模式主机:"+ftpClient.getPassiveHost()+":"+ftpClient.getPassivePort());
                logger.warn("【initFtpClient】: 成功登录服务器,主动模式主机:"+ftpClient.getRemoteAddress()+":"+ftpClient.getRemotePort());
                logger.warn("【initFtpClient】: 成功登录服务器,本地主机:"+ftpClient.getLocalAddress()+":"+ftpClient.getLocalPort());
                logger.warn("【initFtpClient】: 成功登录服务器,返回代码:"+ftpClient.getReplyCode()+",显示状态"+ftpClient.getStatus());        	
    
            }catch (MalformedURLException e) {
                e.printStackTrace();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 上传文件
         * @param pathname ftp服务保存地址
         * @param fileName 上传到ftp的文件名
         * @param inputStream 输入文件流
         * @return
         */
        public boolean uploadFile( String pathname, String fileName,InputStream inputStream){
            boolean flag = false;
            try{
            	logger.warn("【uploadFile】: " + "开始上传文件");
                initFtpClient();
                ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);	//设置传输的模式为二进制文件类型传输
                ftpClient.makeDirectory(pathname);						//设置目录
                ftpClient.changeWorkingDirectory(pathname);				//设置工作路径
                
                ftpClient.enterLocalPassiveMode();						//设置被动模式(FTP客户端在docker容器内,需用被动模式)
                ftpClient.storeFile(fileName, inputStream);				//上传
                
                logger.warn("【uploadFile】: " + "上传文件成功");
                flag = true;            
                return flag;
            }catch (Exception e) {
            	logger.warn("【uploadFile】: " + "上传文件失败");
                e.printStackTrace();
                return flag;
            }finally{
            	if(null != inputStream){
            		try {
            			inputStream.close();							//关闭文件流
            		} catch (IOException e) {
            			e.printStackTrace();
            		}
            	}
                if(ftpClient.isConnected()){
                    try{
    
                        ftpClient.logout();								//退出FTP
                        ftpClient.disconnect();							//断开连接
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    
    
    
    }
    

      

    几个步骤说明:

    ftpClient.setRemoteVerificationEnabled(false);
    ftpClient.setControlEncoding("utf-8");
    ftpClient.connect(ftpConfig.getHostname(), ftpConfig.getPort()); //连接ftp服务器
    ftpClient.login(ftpConfig.getUsername(), ftpConfig.getPassword()); //登录ftp服务器
    int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
    if(!FTPReply.isPositiveCompletion(replyCode)){
                	logger.warn("【initFtpClient】: 登录服务器失败");
                	logger.warn("【initFtpClient】: connect failed...ftp服务器:");
    }
    ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);  //设置文件类型:文件类型为二进制文件
    ftpClient.setControlEncoding("GBK");  //设置编码为GBK
    CreateDirecroty(pathname);
    ftpClient.makeDirectory(pathname);	//设置目录
    ftpClient.changeWorkingDirectory(pathname);	//设置工作路径
    
    ftpClient.enterLocalPassiveMode();	//设置被动模式
    ftpClient.storeFile(fileName, inputStream);//上传
    inputStream.close();
    ftpClient.logout();
    ftpClient.disconnect();
    

      

  • 相关阅读:
    【HTML XHTML CSS基础教程(第6版)】笔记之CSS笔记(7~25章)
    【HTML XHTML CSS基础教程(第6版)】笔记之HTML XHTML笔记(1~6章)
    ASP.NET Ajax简单的无刷新分页
    ArrayList 、Vector 和 LinkedList 有什么区别?
    找工作的一些建议
    WorkSkill整理之 java用Scanner 类输入数组并打印
    PTE 准备之 Describe Image
    PTE 准备之 Repeat sentence
    WorkSkill 面试之 字节跳动一面
    与用户交互
  • 原文地址:https://www.cnblogs.com/amoyzhu/p/9197500.html
Copyright © 2011-2022 走看看