本文由动哒公众号(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

图片.png


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 服务器失败相关推荐

  1. java ftp取远程服务器时间_在 Java 中如何获取 FTP 服务器上的文件修改时间

    使用 Apache Commons Net 进行 FTP 编程的时候,可以使用 FTPClient 类的方法来获取和设置 FTP 服务器上特定文件的修改时间: String getModificati ...

  2. java ftp上传超时_java - Java FTP连接超时 - 堆栈内存溢出

    我正在做一个项目,修改后,稍后会将一些文件上传到FTP服务器...除了弄清楚文件的上传之外,我什么都没有. 我可以成功连接到FTP服务器,但是一旦文件上传,该程序将挂起几分钟,然后显示超时. java ...

  3. java ftp 被动模式_ftp 主动模式与被动模式

    ftp 主动模式与被动模式 2018-09-15 ftp的工作原理 ftp要用到两个tcp连接即要使用两个端口 一个是命令链路:用来传递命令 一个是数据链路:用来上传下载数据 连接ftp server ...

  4. java ftp 损坏_在上载到android上的ftp服务器时,FTPClient损坏图像吗?

    我正在尝试将图像从Android Phone(HTC Desire HD)上传到FTP服务器(在我的本地PC上).图像将发送到FTP服务器,但已损坏. 并且方法(ftpClient.storeFile ...

  5. java 中sun.net.ftp_开发FTP不要使用sun.net.ftp.ftpClient

    转自:http://cai21cn.iteye.com/blog/700188 在开发一个web应用过程中,需要开发一个服务使用ftp功能将数据传输一个网外的ftp服务器.最初使用sun.net.ft ...

  6. java 中 FtpClient 实现 FTP 文件上传、下载

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 源代码大部分是网上找的,查来查去,找到几个可以用的例子,改来改去,揉合成现在这个样子. 一. jar ...

  7. JAVA使用FTPClient类读写FTP

    见:http://blog.csdn.net/kardelpeng/article/details/6588284 1.首先先导入相关jar包 2.创建一个连接FTP的工具类FTPUtil.Java ...

  8. ftpclient读取服务器文件能获得文件名文件大小0_Spring WEB工程整合使用FTP,ftp文本文件解析入库,文件上传下载

    友情提示:文章比较长,方法都是有一层层封装的,阅读需要按照文章顺序阅读 首先写一个简单的FTP工具类,先实现最基本的文件上传,下载,删除,拷贝功能.这里操作FTP是用的commons-net-3.3. ...

  9. java ftp传图片_Java 图片上传方式一 : ftp 图片服务器

    一 : Linux ftp 图片服务器 1. Linux 安装 ftp linux服务器配置 安装ftp yum install vsftpd 启动服务 service vsftpd start 开机 ...

最新文章

  1. 项目部署mysql安装_Tomcat7+jdk+mysql安装及项目部署
  2. 手机技巧:手机丢了记住这四步操作,让你的损失降到最低!
  3. 服务器上有涉密文件,涉密文件保密管理规定
  4. STM32H743+CubeMX-解决FDCAN控制器无法接收远程帧
  5. (转)实现自己的http server
  6. ORA-19809: limit exceeded for recovery files问题解决
  7. 如何成为更好的前端工程师?如何才能进入下一个阶段?
  8. 使用Python Shells绕过杀毒软件
  9. python绘图坐标轴|刻度值|刻度||标题设置
  10. 如何快速进入/打开cmd--快捷键
  11. 如何为长期旅行做准备
  12. 新城易居程伟健:民宿集群,正在走向产业标准化的趋势!
  13. 晨会纪要081110
  14. 如何在笔记本电脑上搭建双系统(windows与linux)
  15. 小米路由器同一wifi局域网下,各主机无法ping连
  16. Linux Centos 7 实现java控制打印机打印文件**
  17. 互联网快讯:中国石化与隆基达成战略合作;极米多款投影产品持续热销;百度网盘青春版正式上线
  18. TypeScript 类型声明书写踩坑全解析
  19. winrar40天试用完了
  20. 教务系统自动评教_PHP版正方教务系统一键评教(已修改BUG)

热门文章

  1. 在创业公司做运营,我总结了这些经验
  2. 关于3D机器视觉检测与双目相机
  3. 【历史上的今天】8 月 26 日:jQuery 发布;中国第一台百万次计算机试制成功
  4. Chatbot-检索式模型介绍(三)
  5. “互联网思维”大起底
  6. 在线画图软件项目结构图
  7. HTML5期末大作业:餐饮网站设计——餐饮店铺(1页) web前端设计与开发期末作品/期末大作业
  8. 超级计算机神威太湖之光图片,超级计算机“神威·太湖之光”世界最快
  9. ubuntu安装xcode包_Ubuntu12.04 安装 Mac OSX 10.9.5和 Xcode 6.2
  10. 水深则流缓,人贵则语迟,有悟性的人请进