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();
                }
            }
        }
    }

}

  

原文地址:https://www.cnblogs.com/amoyzhu/p/9197500.html

时间: 2024-10-07 01:12:09

FTP在docker容器中上传失败解决,改为被动模式的相关文章

连接docker里面的mysql失败解决

场景:在虚拟机的docker容器中安装latest版本的mysql之后,在宿主机中使用navicat连接虚拟机中的mysql出现下图报错: 解决方法: 1.首先docker ps命令查看正在运行的容器,确保我们想要连接的mysql已经启动,如果没启动使用docker start命令启动(下图查看结果表示已经启动了一个mysql) 2.接着运行docker exec -it b30062adc08c /bin/bash进入mysql容器 3.再接着输入mysql -u root -p命令,然后输入

uploadify上传文件Firefox浏览器上传失败解决方法

最近做文件上传使用到了uploadify 但是出现了各种奇葩的问题,而且针对各个不同浏览器问题不同 在Firefox中,很坑爹的是,每次上传就丢失session值,但是我的系统在登录,保存文件目录等处使用了session,结果session值为null: 花了大半天的时间调试, 最后发现是falsh上传的问题sessionid变了,而且在此请求上传文件地址时,系统就会从新登录,这个登录更有意思,每次都回去读IE中的cookie(我的项目中使用了cookie保存用户登录信息),而不是读Firefo

docker系列之二:构建docker容器

1.创建在FlaskApp/app中创建Flask项目: 2.生成web项目所需的运行环境:pip3 freeze > ../requirements.txt 3.编辑Dockerfile: # 依赖的的操作系统 FROM ubuntu:16.04 # image的作者和作者邮箱 MAINTAINER oldeleven "[email protected]" # 安装项目的执行环境 RUN apt-get update -y && apt-get install

【解决】AWS服务控制台中上传文件失败

使用IE 11,在 AWS Services Console 中不管是 S3 还是 Elastic Beanstalk 的页面中上传页面都会失败,提示信息如下: A problem occurred while uploading to S3. 但是在 Chome 中则没有此问题. 此问题的原因判断非常离散,而且有时候同样的操作并不一定能复现.经过反复的尝试,可能与如下两方面原因有问题: 1. IE 设置 在 IE 的 “Internet 选项 > 安全 > Internet > 自定义

docker容器内应用检测失败总结

docker容器内应用检测失败故障总结 各位网友,各位同行大家: 今天在云平台中遇到了一个这样一个问题,在云平台上面docker容器中的应用,在监控客户端 中,显示应用检测失败的问题:以下是经常遇到的几个应用检测失败的常见解决办法如下所示: 问题描述:rds产品  docker容器中的应用检测失败:(备注:宿主机运行正常) 解决思路:1.一般情况下如果应用服务检测失败的话,首先查看一下这个应用的进程是否还在 可以使用命令ps -ef | grep +服务名称:查看一下服务的运行状态.查看一下服务

无需安装 vsftpd , 直接使用 FTP 来管理 docker 容器中的文件

无图无真相,先放个效果图: 背景 使用 docker 来跑一些服务很方便,但是有的时候想管理容器里面的文件却很麻烦 -- 一般常规做法有3种: 通过数据卷或数据卷容器的方式 启动容器的时候时候启动 vsftpd 或者 sshd 等服务,并开启端口映射,然后通过 ftp/sftp 连上去管理 进入容器的终端,通过命令行管理 但是这些做法都有一定的缺陷和不便: 1和2都是需要在启动容器的时候做一些配置,如果容器已经启动了就歇菜了.而且2需要额外的端口映射,占用主机的端口.3的做法比较 geek ,而

docker容器时间不对及java程序时间不对解决

使用docker容器部署的应用,会出现时间与主机不一致的情况 1. 容器时间与主机差8个小时:主机的与容器的/etc/localtime不一致 解决方法:挂载主机的/etc/localtime,如果没有则cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 2. 如果里面运行的是java程序,哪么程序时间还是会8个小时的差别:主要是Java或取时间是从/etc/timezone里获取时区 解决方法:挂载主机的/etc/timezone,如果没有则

使用Kindeditor的多文件(图片)上传时出现上传失败的解决办法/使用Flash上传多文件(图片)上传时上传失败的解决办法

近来用户反映希望我们把在线编辑器中的多图片上传功能实现,因为他们在编辑商品描述时经常会有一次上传多张图片的需求,如果要逐张选择的话效率很低,客户的需求就是我们的追求,很快我们就把完善功能排到了日程表中,要求尽快实现. 我们在项目中使用的在线编辑器是Kindeditor4.1.10,它们的多文件上传插件是使用Flash实现的,原本应该就是能使用的,但为什么老是显示上传失败的,百度了一下前人的经验和教训,出现这种情况,有两种可能:1)上传的目标文件夹没有写权限,导致上传的文件无法进行写操作,所以上传

.net项目中上传大图片失败

.net项目中有时用户提出要上传大图片,一张图片有可能十几兆,本来用的第三方的上传控件,有限制图片上传大小的设置,以前设置的是2M.按照用户的要求,以为直接将限制图片上传大小的设置改下就可以了,但是当上传大图片的时,总是异常:  错误消息:超过了最大请求长度. 解决方案: 错误原因:asp.net默认最大上传文件大小为4M,运行超时时间为90S. 修改web.config中配置 <configuration> <system.web> <httpRuntime useFull