java ftp ftpClient.storeFile 服务器失败
本文由动哒公众号(tongmi5g),QQ群(58621899)提供,欢迎关注获取技术支持,有任何问题群里都会回复。
问题描述
在开发的本地电脑向服务器上传文件没问题,但是,部署之后,在服务器之间上传文件,ftp连接没问题,但是上传死活不成功,ftpClient.storeFile一直返回失败。
解决
原因:
网上找资料原因可能是防火墙策略阻止了java测试服务的端口连接,FTP服务器使用的有可能是被动模式;
注意:
FTP的PORT(主动模式)和PASV(被动模式)
(1) PORT(主动模式)
PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据。
(2) PASV(被动模式)
PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输。
那由于安全的原因,我们在传输的时候使用被动模式。
/*** ftp.enterLocalPassiveMode();* 这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。* 为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,* 但是在linux上或者其他服务器上面,由于安全限制,可能某些端口没有开启,所以就出现阻塞。*/ftpClient.enterLocalPassiveMode();ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);flag = ftpClient.storeFile(fileName, inputStream);
好了,完整的一个例子如下:
package com.wx.utils.ftp;import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;import java.io.*;
import java.net.MalformedURLException;public class FtpUtils {//ftp服务器地址public String hostname = "106.106.106.16";//ftp服务器端口号默认为21public Integer port = 21 ;//ftp登录账号public String username = "ftpuser";//ftp登录密码public String password = "ftpuser";public FTPClient ftpClient = null;/*** 初始化ftp服务器*/public void initFtpClient() {ftpClient = new FTPClient();ftpClient.setControlEncoding("utf-8");try {System.out.println("connecting...ftp服务器:"+this.hostname+":"+this.port);ftpClient.connect(hostname, port); //连接ftp服务器ftpClient.login(username, password); //登录ftp服务器int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器if(!FTPReply.isPositiveCompletion(replyCode)){System.out.println("connect failed...ftp服务器:"+this.hostname+":"+this.port);}System.out.println("connect successfu...ftp服务器:"+this.hostname+":"+this.port);}catch (MalformedURLException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}/*** 上传文件* @param pathname ftp服务保存地址* @param fileName 上传到ftp的文件名* @param originfilename 待上传文件的名称(绝对地址) ** @return*/public boolean uploadFile( String pathname, String fileName,String originfilename){boolean flag = false;InputStream inputStream = null;try{System.out.println("开始上传文件");inputStream = new FileInputStream(new File(originfilename));System.out.println(inputStream);initFtpClient();ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);CreateDirecroty(pathname);ftpClient.makeDirectory(pathname);boolean changeFlag = ftpClient.changeWorkingDirectory(pathname);System.out.println("切换目录:" + changeFlag);/*** ftp.enterLocalPassiveMode();* 这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。* 为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,* 但是在linux上或者其他服务器上面,由于安全限制,可能某些端口没有开启,所以就出现阻塞。*/ftpClient.enterLocalPassiveMode();ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);flag = ftpClient.storeFile(fileName, inputStream);inputStream.close();ftpClient.logout();System.out.println("上传文件成功:" + flag);}catch (Exception e) {System.out.println("上传文件失败");e.printStackTrace();}finally{if(ftpClient.isConnected()){try{ftpClient.disconnect();}catch(IOException e){e.printStackTrace();}}if(null != inputStream){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}return true;}/*** 上传文件* @param pathname ftp服务保存地址* @param fileName 上传到ftp的文件名* @param inputStream 输入文件流* @return*/public boolean uploadFile( String pathname, String fileName,InputStream inputStream){boolean flag = false;try{System.out.println("开始上传文件");initFtpClient();ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);CreateDirecroty(pathname);ftpClient.makeDirectory(pathname);boolean changeFlag = ftpClient.changeWorkingDirectory(pathname);System.out.println("切换目录:" + changeFlag);flag = ftpClient.storeFile(fileName, inputStream);inputStream.close();ftpClient.logout();System.out.println("上传文件结果:" + flag);}catch (Exception e) {System.out.println("上传文件失败");e.printStackTrace();}finally{if(ftpClient.isConnected()){try{ftpClient.disconnect();}catch(IOException e){e.printStackTrace();}}if(null != inputStream){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}return true;}//改变目录路径public boolean changeWorkingDirectory(String directory) {boolean flag = true;try {flag = ftpClient.changeWorkingDirectory(directory);if (flag) {System.out.println("进入文件夹" + directory + " 成功!");} else {System.out.println("进入文件夹" + directory + " 失败!开始创建文件夹");}} catch (IOException ioe) {ioe.printStackTrace();}return flag;}//创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建public boolean CreateDirecroty(String remote) throws IOException {boolean success = true;String directory = remote + "/";// 如果远程目录不存在,则递归创建远程服务器目录if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(new String(directory))) {int start = 0;int end = 0;if (directory.startsWith("/")) {start = 1;} else {start = 0;}end = directory.indexOf("/", start);String path = "";String paths = "";while (true) {String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1");path = path + "/" + subDirectory;if (!existFile(path)) {if (makeDirectory(subDirectory)) {changeWorkingDirectory(subDirectory);} else {System.out.println("创建目录[" + subDirectory + "]失败");changeWorkingDirectory(subDirectory);}} else {changeWorkingDirectory(subDirectory);}paths = paths + "/" + subDirectory;start = end + 1;end = directory.indexOf("/", start);// 检查所有目录是否创建完毕if (end <= start) {break;}}}return success;}//判断ftp服务器文件是否存在public boolean existFile(String path) throws IOException {boolean flag = false;FTPFile[] ftpFileArr = ftpClient.listFiles(path);if (ftpFileArr.length > 0) {flag = true;}return flag;}//创建目录public boolean makeDirectory(String dir) {boolean flag = true;try {flag = ftpClient.makeDirectory(dir);if (flag) {System.out.println("创建文件夹" + dir + " 成功!");} else {System.out.println("创建文件夹" + dir + " 失败!");}} catch (Exception e) {e.printStackTrace();}return flag;}/** * 下载文件 ** @param pathname FTP服务器文件目录 ** @param filename 文件名称 ** @param localpath 下载后的文件路径 ** @return */public boolean downloadFile(String pathname, String filename, String localpath){boolean flag = false;OutputStream os=null;try {System.out.println("开始下载文件");initFtpClient();//切换FTP目录ftpClient.changeWorkingDirectory(pathname);FTPFile[] ftpFiles = ftpClient.listFiles();for(FTPFile file : ftpFiles){if(filename.equalsIgnoreCase(file.getName())){File localFile = new File(localpath + "/" + file.getName());os = new FileOutputStream(localFile);ftpClient.retrieveFile(file.getName(), os);os.close();}}ftpClient.logout();flag = true;System.out.println("下载文件成功");} catch (Exception e) {System.out.println("下载文件失败");e.printStackTrace();} finally{if(ftpClient.isConnected()){try{ftpClient.disconnect();}catch(IOException e){e.printStackTrace();}}if(null != os){try {os.close();} catch (IOException e) {e.printStackTrace();}}}return flag;}/** * 删除文件 ** @param pathname FTP服务器保存目录 ** @param filename 要删除的文件名称 ** @return */public boolean deleteFile(String pathname, String filename){boolean flag = false;try {System.out.println("开始删除文件");initFtpClient();//切换FTP目录ftpClient.changeWorkingDirectory(pathname);ftpClient.dele(filename);ftpClient.logout();flag = true;System.out.println("删除文件成功");} catch (Exception e) {System.out.println("删除文件失败");e.printStackTrace();} finally {if(ftpClient.isConnected()){try{ftpClient.disconnect();}catch(IOException e){e.printStackTrace();}}}return flag;}public static void main(String[] args) {FtpUtils ftp =new FtpUtils();ftp.uploadFile("vehicle/2020-07-03", "yyyyy1.jpg", "C:\\Users\\Administrator\\Desktop\\代金券测试\\yyyyy1.jpg");//ftp.downloadFile("ftpFile/data", "123.docx", "F://");
// ftp.deleteFile("ftpFile/data", "123.docx");System.out.println("ok");}
}
其他的坑,登陆不了:
530 Login incorrect.
解决:创建用户的时候使用-s /sbin/nologin
[root@instance-kkvak9j5 vsftpd]# useradd vsftpd -s /sbin/nologin
[root@instance-kkvak9j5 vsftpd]# passwd vsftpd
参考:https://freexyz.cn/dev/44351.html
http://www.taodudu.cc/news/show-2990309.html
相关文章:
- HTTP 提交方式有哪些
- 2.1.4 选择器处理网络请求
- 办公自动化基础知识题二
- [转载]Office文档在线编辑的实现之二
- office2007各组件全面介绍
- 15.全文检索-ElasticSearch
- JAVA JSP javaweb网上订餐系统餐厅点餐系统源码(ssm点餐系统)网上订餐系统在线订餐
- 基于android餐馆点餐系统报告感想,基于Android的餐厅点餐系统的设计与实现
- 随心所欲----食堂点餐系统设计
- python界面实现点餐系统_基于PythonFlask的网上点餐系统管理员后台开发
- mysql餐馆点餐系统_课内资源 - 基于Jsp和MySql的餐厅点餐系统
- C++餐厅点餐结算系统
- android移动点餐系统内容和要求,基于Android云计算的移动点餐系统
- oracle餐厅网络点餐系统_点餐系统产品演示
- linux课程设计 点菜,餐馆点餐系统专业课程设计.doc
- Java语言写点餐系统
- 餐馆点餐系统(Java GUI + mysql)
- day35 数据库的初步认识
- 初识 Mysql
- 01.MySQL数据库初识
- Design and Implementation of a Highly Efficient DGEMM for 64-bit ARMv8 Multi-Core Processors
- BPM软件_财务报销流程管理解决方案_K2工作流引擎
- “更高效率:标准化+简约风+移动化”--K2 BPM老客户交流会
- 一 数据库初识
- 有一家做BPM的公司叫K2,Gartner和IDC都说好!
- NBA球星管理系统 v1.0
- 《会计信息系统》课程期末复习题与参考答案
- 转载 感受K2.Net 2003工作流解决方案
- KStar ----BPM应用框架,K2 的新星
- K2 重磅出击,构建财务共享中心方案,促进企业标准化
java ftp ftpClient.storeFile 服务器失败相关推荐
- java ftp取远程服务器时间_在 Java 中如何获取 FTP 服务器上的文件修改时间
使用 Apache Commons Net 进行 FTP 编程的时候,可以使用 FTPClient 类的方法来获取和设置 FTP 服务器上特定文件的修改时间: String getModificati ...
- java ftp上传超时_java - Java FTP连接超时 - 堆栈内存溢出
我正在做一个项目,修改后,稍后会将一些文件上传到FTP服务器...除了弄清楚文件的上传之外,我什么都没有. 我可以成功连接到FTP服务器,但是一旦文件上传,该程序将挂起几分钟,然后显示超时. java ...
- java ftp 被动模式_ftp 主动模式与被动模式
ftp 主动模式与被动模式 2018-09-15 ftp的工作原理 ftp要用到两个tcp连接即要使用两个端口 一个是命令链路:用来传递命令 一个是数据链路:用来上传下载数据 连接ftp server ...
- java ftp 损坏_在上载到android上的ftp服务器时,FTPClient损坏图像吗?
我正在尝试将图像从Android Phone(HTC Desire HD)上传到FTP服务器(在我的本地PC上).图像将发送到FTP服务器,但已损坏. 并且方法(ftpClient.storeFile ...
- java 中sun.net.ftp_开发FTP不要使用sun.net.ftp.ftpClient
转自:http://cai21cn.iteye.com/blog/700188 在开发一个web应用过程中,需要开发一个服务使用ftp功能将数据传输一个网外的ftp服务器.最初使用sun.net.ft ...
- java 中 FtpClient 实现 FTP 文件上传、下载
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 源代码大部分是网上找的,查来查去,找到几个可以用的例子,改来改去,揉合成现在这个样子. 一. jar ...
- JAVA使用FTPClient类读写FTP
见:http://blog.csdn.net/kardelpeng/article/details/6588284 1.首先先导入相关jar包 2.创建一个连接FTP的工具类FTPUtil.Java ...
- ftpclient读取服务器文件能获得文件名文件大小0_Spring WEB工程整合使用FTP,ftp文本文件解析入库,文件上传下载
友情提示:文章比较长,方法都是有一层层封装的,阅读需要按照文章顺序阅读 首先写一个简单的FTP工具类,先实现最基本的文件上传,下载,删除,拷贝功能.这里操作FTP是用的commons-net-3.3. ...
- java ftp传图片_Java 图片上传方式一 : ftp 图片服务器
一 : Linux ftp 图片服务器 1. Linux 安装 ftp linux服务器配置 安装ftp yum install vsftpd 启动服务 service vsftpd start 开机 ...
最新文章
- 项目部署mysql安装_Tomcat7+jdk+mysql安装及项目部署
- 手机技巧:手机丢了记住这四步操作,让你的损失降到最低!
- 服务器上有涉密文件,涉密文件保密管理规定
- STM32H743+CubeMX-解决FDCAN控制器无法接收远程帧
- (转)实现自己的http server
- ORA-19809: limit exceeded for recovery files问题解决
- 如何成为更好的前端工程师?如何才能进入下一个阶段?
- 使用Python Shells绕过杀毒软件
- python绘图坐标轴|刻度值|刻度||标题设置
- 如何快速进入/打开cmd--快捷键
- 如何为长期旅行做准备
- 新城易居程伟健:民宿集群,正在走向产业标准化的趋势!
- 晨会纪要081110
- 如何在笔记本电脑上搭建双系统(windows与linux)
- 小米路由器同一wifi局域网下,各主机无法ping连
- Linux Centos 7 实现java控制打印机打印文件**
- 互联网快讯:中国石化与隆基达成战略合作;极米多款投影产品持续热销;百度网盘青春版正式上线
- TypeScript 类型声明书写踩坑全解析
- winrar40天试用完了
- 教务系统自动评教_PHP版正方教务系统一键评教(已修改BUG)
热门文章
- 在创业公司做运营,我总结了这些经验
- 关于3D机器视觉检测与双目相机
- 【历史上的今天】8 月 26 日:jQuery 发布;中国第一台百万次计算机试制成功
- Chatbot-检索式模型介绍(三)
- “互联网思维”大起底
- 在线画图软件项目结构图
- HTML5期末大作业:餐饮网站设计——餐饮店铺(1页) web前端设计与开发期末作品/期末大作业
- 超级计算机神威太湖之光图片,超级计算机“神威·太湖之光”世界最快
- ubuntu安装xcode包_Ubuntu12.04 安装 Mac OSX 10.9.5和 Xcode 6.2
- 水深则流缓,人贵则语迟,有悟性的人请进