FTPClient 上传文件连接超时java.net.ConnectException: Connection timed out: connect

标签: APache  FTPClient  ftp  nginx  vsftpd

今天用nginx+vsftpd做了一个图片服务器,使用Java代码上传和下载图片的过程中上传失败,reply也不返回值
Ubuntu16下的nginx+vsftpd的配置见另一个博客

上传类的代码

    /**
     * Description: 向FTP服务器上传文件
     * @param host FTP服务器hostname
     * @param port FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param basePath FTP服务器基础目录
     * @param filePath FTP服务器文件存放路径。例如分日期存放:/2019/01/01。文件的路径为basePath+filePath
     * @param filename 上传到FTP服务器上的文件名
     * @param input 输入流
     * @return 成功返回true,否则返回false
     */
    public static boolean uploadFile(String host, int port, String username, String password, String basePath, String filePath, String filename, InputStream input){
        boolean result = false;
        FTPClient ftp = new FTPClient();
        FTPClientConfig config = new FTPClientConfig();
        config.setLenientFutureDates(true);
        ftp.configure(config);
        try{
            int reply;
            ftp.connect(host, port);    //连接FTP服务器
            //如果采用默认端口,则可以使用connect(host)的方式直接连接ftp服务器
            ftp.login(username, password);      //登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)){
                ftp.disconnect();
                return result;
            }
            //切换到上传目录
            if (!ftp.changeWorkingDirectory(basePath+filePath)){
                    //如果目录不存在则创建目录
                    String[] dirs = filePath.split("/");
                    String tempPath = basePath;
                for (String dir : dirs){
                    if (null == dir || "".equals(dir)) continue;
                    tempPath += "/" + dir;
                    if (!ftp.changeWorkingDirectory(tempPath)){
                        if (!ftp.makeDirectory(tempPath)){
                            return result;
                        }else {
                            ftp.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            //设置文件上传类型为二进制类型
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            //上传文件
            if (!ftp.storeFile(filename, input)){
                return result;
            }
            System.out.println(result);
            input.close();
            ftp.logout();
            result = true;
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if (ftp.isConnected()){
                try{
                    ftp.disconnect();
                }catch (IOException ioe){
                    ioe.printStackTrace();
                }
            }
        }

        return result;
    }

但是运行结果显示我已经成功上传,但是我的服务器上没有任何数据

解决思路

google了许多大佬们的博客,大致都是在说vsftpd的工作模式有两种
vsftpd工作模式
于是我添加了如下代码

ftp.enterLocalPassiveMode();		//这个设置允许被动连接--访问远程ftp时需要

但是又出了问题

java.net.ConnectException: Connection timed out: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:894)
	at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:633)
	at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:624)
	at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1976)
	at main.cn.sico_technology.simon.FtpUtil.uploadFile(FtpUtil.java:58)
	at main.cn.sico_technology.simon.FTPTest.testFtpUtils(FTPTest.java:38)
	at main.cn.sico_technology.simon.FTPTest.main(FTPTest.java:50)

显示我 ftp连接超时,试图通过printf debug法检查我的程序到底运行到哪里出了问题,显示在目录的创建上就进不去了。

理解PASV(被动模式)的工作流程

pasv工作流程
于是我更换了允许被动连接的代码的位置在ftp.connect();之前

	    FTPClient ftp = new FTPClient();
        ftp.enterLocalPassiveMode();        //这个设置允许被动连接--访问远程ftp时需要
        FTPClientConfig config = new FTPClientConfig();
        config.setLenientFutureDates(true);
        ftp.configure(config);

再次运行则可以正常上传下载
run
服务器端数据
server

版权声明:本文为BOB_sm原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/BOB_sm/article/details/93117863

智能推荐

算法第一次作业-Problem A. 因式分解

题目描述 小明的数学老师给小明布置了一道数学题,让小明求2000以内所有正因子个数为K的正整数。例如18的正因数为1,2,3,6,9,18 首先是数学知识: 所谓N的正因数,就是指在 1到N这个范围中(包括1和N) 能被N整除后为0的数字。 例如:N=18 时,18%10 18%20 18%30 18%60 18%90 18%180 所以1、2、3、6、918 就是18的正因数。 看到算法类题的时...

hbase的基本操作

HBase是一个分布式的、面向列的开源数据库。HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。 Hbase的组成结构可用表形容: hbase是一张表:表中有一个唯一键是 row key, 每个row key 对应 N(N >= 1)个列族...

使用django实现京东部分商品数据的爬虫并存入自带的sqlite数据库

【操作步骤】: 新建django项目:jdDemo 在控制台Terminal中输入python manage.py startapp spider新建spider应用 在jdDemo/settings.py中加入应用spider 在spider下新建urls.py文件 在jdDemo/urls.py中建立与子urls的连接 在spider/urls下指向views处理函数,views会自动创建相应...

cocos 旋转屏幕实现方案,ios和android

ios:附一段解决方案,在原生代码里,旋转之前将屏幕方案设置成未知的,然后再设置自己想要的方向。如果用户锁定了屏幕方案,此方法依然有效。 ANDROID平台(AppActivity.java里添加以下代码,需要import android.content.pm.ActivityInfo;):   ((AppActivity)(SDKWrapper.getInstance().getCon...

springboot+activiti7生成流程跟踪/历史图

前言 本人在做此功能的时候在网上搜了一圈,都是基于activiti5或activiti6实现的。如果你的项目使用的activiti7实现流程跟踪/历史图,那么恭喜你下面的代码拷贝到你的项目就行了,下面代码实现的最终效果如下图: 代码 重写DefaultProcessDiagramGenerator类 重写DefaultProcessDiagramCanvas类 controller类中实现 ser...

猜你喜欢

SSH环境搭建

水水的我开始写水水的java web 项目,写项目前首先是环境搭建,环境搭建主要是jar包导入。jar如果导入正确,配置文件没有问题,项目很快就能做的差不多。 第一步 jar包 SSH,顾名思义包括Struts、Spring和hibernate。关键就是三者单独的jia包和整合起来的jar. Sping jar包 1首先包括4+1:即核心(core),上下文(context),工厂(beans),...

使用Stream distinct()去重失效问题

使用Stream distinct()去重实体类List失效问题 注意:这里用的是 filter实现 根据某个属性对实体list去重 思路: 1、创建用于接受临时数据的list。 2、在filter中判断当前节点的元素是否在临时list中存在 3、如果存在则return false。 4、如果不存在则将节点元素添加到List中并且return true。 实例测试: 打印结果: 去重前 去重后:...

10.从零开始学习Java-多线程

多线程 首先线程是CPU的基本调度单位, 然后两种创建线程的方法(其中,方法2继承Runnable最为常用), 然后加锁两种解决线程不同步的方法。 有了锁就有可能产生死锁的问题,(线程之间都需要对方的锁标记,同时自己不会释放锁,产生死锁) 通过线程通信(wait和notify)解决死锁。 一、什么是多线程 1.1 进程: 程序是静止的,只有真正运行时的程序, 才被称为进程。 单核CPU在任何时间点...

WebView如何使用

Webview本身使用起来就较为简单,这里写一些常见的用法吧,先上效果图: 如图,用自己app打开想要查看的网页或者本地文件 首先在AndroidManifest文件里面去注册联网的权限,当然如果只是访问本地的话就不用注册了 第二步:写一个布局,以上图为例,在activity_main.xml中写: 第三步,在MainActivity.class中写: 要用的权限,以及相关的属性都在代码中做了备注...

《JSP应用开发详解》学习:out.write()和out.print()

out.write()和out.print()都可以用于向浏览器输出内容。 out对象的类型是JspWriter。JspWriter继承了java.io.Writer类。 两个方法的区别是: 1)write()方法是Write类的方法,而print()是JSP内置类out的方法。 2)重载的print方法可将各种类型的数据转换成字符串的形式输出,而重载的write方法只能输出字符、字符数组和字符串...