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的工作模式有两种

于是我添加了如下代码
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(被动模式)的工作流程

于是我更换了允许被动连接的代码的位置在ftp.connect();之前
FTPClient ftp = new FTPClient();
ftp.enterLocalPassiveMode(); //这个设置允许被动连接--访问远程ftp时需要
FTPClientConfig config = new FTPClientConfig();
config.setLenientFutureDates(true);
ftp.configure(config);
再次运行则可以正常上传下载

服务器端数据

智能推荐
算法第一次作业-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方法只能输出字符、字符数组和字符串...
