Java使用FTP时碰到的坑--服务部署到linux时storeFile返回false

2023-05-16

背景

正常情况下,我们都是把上传的文件保存到Java服务运行的服务器上。前段时间根据公司正式环境上的情况,必须要把文件做成跨服务器存储,经过考虑,最终采用FTP工具存储文件。
因为保存的文件并不是客户使用的文件,而是给运维人员使用的,所以这里并不需要考虑太多,直接写个简单的功能实现就好了。

正文

FTP服务站点怎么建,网上很多教程,不做赘述。本文只记录碰到的坑。
我是在window下开发,FTP服务端是window操作系统,开发阶段测试也在window下debug进行,正式环境下Java服务运行在linux上,采用docker部署。
在开发时一切正常,可是部署到服务器上,没有报出任何异常,但是ftp.storeFile()返回false。

依赖

查阅不少资料,很多人找不到jar包,甚至到网上求博主私信jar包,我不太理解为什么找不到,这里直接maven引入依赖就行了。

        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.6</version>
        </dependency>

实现代码

    /**
     * @param url       服务器IP地址
     * @param port      服务器端口
     * @param userName  用户登录名
     * @param password  用户登录密码
     * @param storePath 服务器文件存储路径
     * @param fileName  服务器文件存储名称
     * @param is        文件输入流
     * @return 			true上传成功    false上传失败
     */
    public static boolean storeFile(String url,
                                    int port,
                                    String userName,
                                    String password,
                                    String storePath,
                                    String fileName,
                                    InputStream is) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            ftp.connect(url, port);// 连接至服务器,端口默认为21时,可直接通过URL连接
            ftp.login(userName, password);// 登录服务器
            // 判断返回码是否合法
            if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                ftp.disconnect();// 不合法时断开连接
                return result;// 结束程序
            }
            ftp.setControlEncoding("UTF-8"); // 中文转码
            ftp.enterLocalPassiveMode();// 被动模式
            ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);//设置传输方式为流方式
            ftp.changeWorkingDirectory(storePath); // 设置文件操作目录
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置文件类型,二进制
            ftp.setBufferSize(3072); // 设置缓冲区大小
            fileName = new String(fileName.getBytes("GBK"), "iso-8859-1");//文件名中文报错问题
            result = ftp.storeFile(fileName, is);//上传文件
            is.close();
            ftp.logout();// 登出服务器
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != is) {
                    is.close();
                }
                if (ftp.isConnected()) {
                    ftp.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

重点在下面这两句:
ftp.enterLocalPassiveMode();// 被动模式
ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);//设置传输方式为流方式

主动模式和被动模式

  1. PORT主动模式:ftp.enterLocalActiveMode();
    在这个模式下,客户端通过服务端的默认端口与服务端连接。在使用时客户端会随机开发一个端口发送PORT命令道服务端,告诉服务端客户端采用了主动模式和开放的端口。服务端收到客户端的PORT命令后,与客户端连接发送数据。
  2. PASV被动模式:ftp.enterLocalPassiveMode();
    在这个模式下,客户端发送的命令为PASV,此时是服务端开放端口给客户端连接,对于客户端而言是被动连接上服务端(客户端:我很被动,因为你服务端不告诉我端口,请问我要怎么连接?),开始数据传输。
    在正式环境里面,服务器的防火墙基本都是开的,需要什么端口在开放什么端口,如果没有设置被动模式传输数据,那客户端恐怕一辈子都连不上服务端,这导致的结果就是文件传输请求成功了,但是文件没有传过去,返回false。
    这也就是为什么服务器上没有上传的文件了。
    至于为什么不会报错,我跟了一下源码,大概意思就是针对文件传输结果一个返回码的问题。
    在这里插入图片描述
    看上图,返回结果就是true或者false,并无报错。上面的注释大概意思就是请求会返回一个响应码,2开头为true,3开头就是false。
    最后附上调用方法:
			MultipartFile file = ((MultipartHttpServletRequest) request).getFile("file");
            if (!file.isEmpty()) {
                try {
                    InputStream inputStream = file.getInputStream();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                boolean res = FTPUtils.storeFile("127.0.0.1", "21", userName, password, "//", file.getOriginalFilename(), inputStream);
                if (!res) {
                    msg = "FTP发生异常---->>>>文件上传失败";
                    return new ResponseDto<>(RespCode.ERROR.getId(), msg, null);
                }

本文END。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java使用FTP时碰到的坑--服务部署到linux时storeFile返回false 的相关文章

  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • 使用 ChannelExec 的命令未执行 - Jsch

    我正在使用 Jsch 在服务器中创建一个文件并执行一些命令 对于文件创建 它工作正常 但是对于命令执行 则不然 它保持状态 1 仍在处理它 并永远保持该状态 这种情况发生在 shell 执行或我尝试成为 root 时 请按照以下方法操作 p
  • 如何比较 Struts 2 中 url 请求参数中的单个字符

    我正在读取具有单个字符的 url 参数 它将是Y or N 我必须写一个条件来检查它是否Y or N并做相应的事情 这是我写的 但似乎不起作用 总是转到其他地方 网址是
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • JFace ColumnWeigthData 导致父级增长

    我有一个 Eclipse RCP 应用程序 并且想要在TableViewer using ColumnWeigthData as ColumnLayoutData 问题是父表单 ScrolledForm在示例代码中 每当我布局表格时都会增加
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • Intellij 中的 Google OR-Tools:UnsatisfiedLinkError

    我正在建立一个应该使用 Google OR Tools 的 java 框架 下面的代码编译成功 但在运行时抛出异常 Exception in thread main java lang UnsatisfiedLinkError com go
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 如何将 Observable>> 转换为 Observable>

    我陷入了如何将以下可观察类型转换 转换为我的目标类型的困境 我有以下类型的可观察值 Observable
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 带有 OpenId 提供程序的 Java Spring 安全性

    我有一个 spring MVC 应用程序 另一个客户端应用程序想要使用 open id connect 访问我的 spring 应用程序 如何在服务器端实现开放ID提供商 请帮忙 MITREid 连接 OpenID Connect Java
  • 如何初始化静态地图?

    你会如何初始化静态Map在Java中 方法一 静态初始化方法二 实例初始化 匿名子类 或者 还有其他方法吗 各自的优点和缺点是什么 这是说明这两种方法的示例 import java util HashMap import java util
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 公共方法与公共 API

    在干净的代码书中 有一个观点是 公共 API 中的 Javadocs 同样 Effective java 一书也有这样的内容 项目 56 为所有公开的 API 元素编写文档注释 所以这就是我的问题 所有公共方法都被视为公共 API 吗 它们
  • Java:使用 Graph API 在线更新 Sharepoint 上的 docx 文件

    我在使用 Java 在线更新 Sharepoint 上的 docx 文件时遇到问题 首先 我检查了构建 PUT 请求的 URL 此处 并使用此请求 PUT drives drive id items item id content 我首先使
  • 如何在不同版本的Google App Engine中使用自定义域名?

    我使用谷歌应用程序引擎作为我的 Android 和 Web 应用程序的服务器 我使用 Android Studio 开发了 Android 应用程序 并使用 Eclipse 开发了 Web 应用程序 我在应用程序引擎中部署了两个版本 第一个
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两

随机推荐

  • 多线程经典题目

    多线程编程 目录 文章目录 多线程编程目录work1work2work3work4work5work6work7work8锁的实现线程间同步唤醒 阻塞交替打印方式相关blogLambda原子类型理论锁模型Java锁底层实现 work1 sp
  • 抖音短视频脚本制作的一些技巧,快快收藏起来!

    在抖音上发布一个成功的短视频需要多方面的考虑 xff0c 其中最重要的是脚本的制作 一个好的脚本不仅可以吸引用户观看 xff0c 还可以让用户产生共鸣 xff0c 从而提高视频的传播效果 以下是不若与众科技一些关于抖音短视频脚本制作的技巧
  • java中http请求带cookie

    span class hljs built in String span urlPath 61 span class hljs string 34 你的请求链接 34 span span class hljs built in String
  • Linux系统下使用rpm安装时失败 出现错误:“依赖检测失败” 解决方法

    今天长青在重新安装yum的时候出现了这种错误 xff0c 提示 依赖检测失败 解决方法 xff1a 在命令末尾加上 nodeps force 参数意思 xff1a nodeps xff1a 不检测依赖关系 force xff1a 强制安装
  • springboot的sql日志打印与AOP实现接口调用日志打印

    Springboot的sql日志打印与AOP实现接口调用日志打印 96 1 Springboot与mybatis或者mybatisplus 打印sql执行语句 使用的是springboot中内部嵌入的日志框架 2 接口调用日志 xff0c
  • 双一流博士整理的71个OpenCV实战项目教程开放下载!

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 近期小白学视觉公众号推出了多篇Python 43 OpenCV实战项目的文章 xff0c 深受小伙伴们的喜爱 最近有小伙伴推荐 xff
  • 资料分析之增长量

    一 增长量的计算 识别 xff1a 增长 43 单位 公式 xff1a 1 给出现期 基期 xff1a 增长量 61 现期 基期 2 给出现期 增长率 xff1a 增长量 61 r 现期 1 43 r 速算 xff1a 1 尾数法法 xff
  • Manjaro 基础配置及常用软件安装

    更新源 获取key https mirrors tuna tsinghua edu cn help archlinux https mirrors tuna tsinghua edu cn help archlinuxcn 安装常用工具 x
  • JS中new Date().format("YYYY-mm-dd")提示format is not a function的解决办法

    format方法已经被移除了 xff0c 赶快换个组件 xff01 如果是个懒人 xff0c 就不要再看那些自己写方法大神给的函数了 xff01 xff01 用moment xff0c npm一下子就能装好 xff0c 很好用 xff01
  • python去掉字符串中的指定字符的方法

    我们在使用 Python处理字符串的时候 xff0c 经常会遇到一些字符串中出现了指定字符 xff0c 比如以下代码 xff1a 上面代码中的 就是一个指定字符 xff0c 在 python中 xff0c 如果使用 替换为指定字符 xff0
  • linux使用yum安装JDK8

    安装步骤 xff1a 1 查看是否已安装JDK yum list installed span class token operator span grep java 2 卸载CentOS系统Java环境 yum span class to
  • 图像的边缘检测和缺失修复(附matlab代码)

    最近在数学建模过程中老师给了个图片分别在清晰 有噪声及模糊状态下对其进行边缘检测的题目 xff0c 最后一题是将图片中一部分抠出后将图片按照剩余图片的特征进行修复 xff0c 整个问题涉及到人工智能及计算机视觉的领域较多 xff0c 和队友
  • FileNotFoundError:[Errno 2] No such file or directory :

    FileNotFoundError Errno 2 No such file or directory 1 根本原因 xff1a 路径有问题 2 可能的原因 xff1a 1 xff09 注意Windows与Linux分隔符的区别 Windo
  • Python学习-使用matplotlib画动态多图

    近期经常使用matplotlib进行数学函数图的绘制 xff0c 但是如何使用matplotlib绘制动态图 xff0c 以及绘制动态多图 xff0c 直到今天才学会 1 参考文字 首先感谢几篇文字的作者 xff0c 帮我学会了如何绘制 x
  • VS Code:无法在终端运行命令的解决方法

    1 在VSCode配置好 java 的开发环境后 xff0c 在终端运行时出现如下错误 xff1a 2 刚开始以为是系统环境没配置好 xff0c 结果在 PowerShell 运行没问题 xff1a 3 网上找到了解决方法 xff0c 原因
  • 应用宝sdk跳坑之路 - 1

    这次接入的是ysdk加midas的客户端下单模式 第一次接ysdk xff0c 卡住情况是在对接人员不搭理情况下 登录 0 qq登录未设置调试者账号 和 微信登录签名对不上的就不说了 1 登录的时候返回码一直是3100 xff0c 您尚未登
  • vscode本地同步修改ftp服务器文件

    这里写自定义目录标题 vscode本地同步修改ftp服务器文件搜索插件插件设置本地修改与服务器文件同步 vscode本地同步修改ftp服务器文件 本文记录一下本人使用vscode成功连接远程ftp服务器 xff0c 并成功修改文件的步骤 搜
  • docker拉命令时报错 ERROR: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout

    报错 xff1a 关于pull 命令时报错 xff1a get https registry 1 docker io v2 ner http TLS handshake timeout 或者 request canceled while w
  • 2018年App测试流程及要点梳理

    先说说 xff0c 为什么要给大家梳理App测试流程和要点呢 xff1f 主要是缘于有太多同学咨询相关App测试的问题 xff0c 回答的次数多了 xff0c 就不想打字了 xff0c 还不如这样全部帮你们整理好 xff0c 希望各位看到的
  • Java使用FTP时碰到的坑--服务部署到linux时storeFile返回false

    背景 正常情况下 xff0c 我们都是把上传的文件保存到Java服务运行的服务器上 前段时间根据公司正式环境上的情况 xff0c 必须要把文件做成跨服务器存储 xff0c 经过考虑 xff0c 最终采用FTP工具存储文件 因为保存的文件并不