FTP上传文件,报“系统错误”

SAP ABAP FTP文件传输实战:从配置到代码的完整指南 文件传输协议(FTP)作为一种经典的数据交换方式,其核心原理是通过客户端与服务器之间的命令和数据通道,实现可靠的文件上传与下载。在SAP ABAP开发领域,利用FTP进行批量、非实时文件传输,是连接SAP系统与外部环境的关键技术,尤其适用于处理供应商清单、客户报表、银行对账等结构化数据文件。其技术价值在于通过标准化的函数模块和集中化的RFC目的地配置,实现了安全、可维护的自动化数据交换流程。本文聚焦于SAP ABAP FTP处理,深入解析如何通过SM59事务码配置连接,并运用FTP_CONNECT、FTP_ 阅读详情

最近通过FTP上传文件遇到了报“系统错误”异常。 

一、代码示例

1、FTP上传代码

public Boolean ftpUpload(string filePath, string fileContent, string fileName, Boolean b_isFtpBackup)
    {
        b_ftpRet = true;
        if (s_isFtp.Equals("1"))
        {
            FileUtil.getInstance().backupLog("ftpUpload start", IniUtil.getInstance().b_debug);
            FileInfo fileInf = new FileInfo(filePath);
            string uri = ftpURI + fileInf.Name;
            FileUtil.getInstance().backupLog("根据uri创建FtpWebRequest对象" + uri, IniUtil.getInstance().b_debug);
            // 根据uri创建FtpWebRequest对象
            FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
            if (ftpUserID != null)
            {
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            }
            FileUtil.getInstance().backupLog("根据uri创建FtpWebRequest对象完毕", IniUtil.getInstance().b_debug);
            // 默认为true,连接不会被关闭  
            // 在一个命令之后被执行  
            reqFTP.KeepAlive = false;
            //指定执行什么命令  
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            // 指定数据传输类型
            reqFTP.UseBinary = true;
            reqFTP.UsePassive = false;
            // 上传文件时通知服务器文件的大小  
            reqFTP.ContentLength = fileInf.Length;
            reqFTP.Timeout = 30000;
            // 缓冲大小设置为2kb 
            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen;
            FileStream fs = null;
            Stream strm = null;
            try
            {
                FileUtil.getInstance().backupLog("111111111111111", IniUtil.getInstance().b_debug);
                // 打开一个文件流 (System.IO.FileStream) 去读上传的文件  
                fs = fileInf.OpenRead();
                FileUtil.getInstance().backupLog("22222222222", IniUtil.getInstance().b_debug);
                // 把上传的文件写入流
                strm = reqFTP.GetRequestStream();
                FileUtil.getInstance().backupLog("3333333333333", IniUtil.getInstance().b_debug);
                // 每次读文件流的2kb  
                contentLen = fs.Read(buff, 0, buffLength);
                FileUtil.getInstance().backupLog("4444444444444444", IniUtil.getInstance().b_debug);
                // 流内容没有结束
                while (contentLen != 0)
                {
                    // 把内容从file stream 写入 upload stream  
                    strm.Write(buff, 0, contentLen);
                    FileUtil.getInstance().backupLog("555555555555555", IniUtil.getInstance().b_debug);
                    contentLen = fs.Read(buff, 0, buffLength);
                }
                if (b_isFtpBackup)
                {
                    FileUtil.instance.Log(filePath + "--上传成功!");
                }
                else
                {
                    if (MainForm.instance.bufferFTPBtn.Enabled)
                    {
                        FTPStateChange("缓存文件上传中...");
                        FileUtil.getInstance().backupLog("缓存文件上传中...");
                        BufferFTPChange(false);
                    }
                }
            }
            catch (Exception ex)
            {
                if (ftpBufferUploadRuuning)
                {
                    FTPStateChange("FTP连接失败!");
                    FileUtil.getInstance().backupLog("FTP连接失败!");
                    BufferFTPChange(true);
                }
                b_ftpRet = false;
                if (b_isFtpBackup)
                {
                    FileUtil.instance.Log(filePath + "--上传失败!");
                }
                FileUtil.instance.backupLog("Ftphelper Upload Error --> " + ex.Message);
                if (IniUtil.getInstance().isBackup.Equals("1") && b_isFtpBackup)
                {
                    FileUtil.getInstance().WriteFile(FileUtil.getInstance().ftpBufferPath + "\\" + fileName, fileContent, null, FileMode.Create);
                }
            }
            finally
            {
                // 关闭两个流 
                try
                {
                    if (strm != null)
                    {
                        strm.Close();
                    }
                }
                catch (Exception e)
                {
                    FileUtil.instance.backupLog("strm.Close() exception," + e.Message);
                }
                try
                {
                    if (fs != null)
                    {
                        fs.Close();
                    }
                }
                catch (Exception e)
                {
                    FileUtil.instance.backupLog("fs.Close() exception," + e.Message);
                }
            }
        }
        return b_ftpRet;
    }
}

2、检测FTP是否可用代码

public Boolean CheckFtp()
{
	Boolean ret = true;
	try {
        FileUtil.getInstance().Log("checkftp start," + ftpURI);
        FtpWebRequest reqFTP;
        // 根据uri创建FtpWebRequest对象
        FileUtil.getInstance().Log("根据uri创建FtpWebRequest对象...");
        reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
        FileUtil.getInstance().Log("获取ListDirectory...");
        reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
        FileUtil.getInstance().Log("userID,password登录...");
        reqFTP.UseBinary = true;
		reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
        FileUtil.getInstance().Log("登录后等待response...");
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        FileUtil.getInstance().Log("获取response成功,ftp连接成功!");
    } catch (Exception e) {
		if(!b_ftpRet){
			FileUtil.instance.Log("CheckFtp Exception:" + e.Message);
		}
		ret = false;
	}
	return ret;
}

测试FTP连接居然用了10秒,而我的FTPtimeout设置的是2秒,故失败,但是为什么这么慢呢?

3、FTP工具测试

 

二、原因分析

1、FtpWebRequest.KeepAlive

如果不应销毁到服务器的连接,则为 true;否则为 false。 默认值是 true。

2、FtpWebRequest.UseBinary

true,指示服务器要传输的是二进制数据;false,指示数据为文本。 默认值是 true。

3、FtpWebRequest.UsePassive

(1)默认值:true,被动模式

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。 当需要传送数据时, 服务器在命令链路上用PASV命令告诉客户端:“我打开了***X端口,你过来连接我”。于是客户端向服务器的***X端口发送连接请求,建立一条数据链 路来传送数据。

(2)UsePassive=false,主动模式

PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。 当需要传送数据时, 客户端在命令链路上用PORT命令告诉服务器:“我打开了***X端口,你过来连接我”。于是服务器从20端口向客户端的***X端口发送连接请求,建立 一条数据链路来传送数据。 

(3)优缺点

主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。

感觉和这个没啥关系啊。

4、此时,灵光乍现,reqFTP.Timeout = 2000;

FTP上传超时2秒,也就是说2秒上传失败的话,就不传了,但是测试FTP都需要10秒,故失败,系统错误,传不上去。

索性改为20秒算了,开心的是性能客户不考虑,告诉我能传上去就行了,真的是良心客户啊,但是还是没找到根本原因,我感觉是FTP服务端设置了什么东西,不让客户端传的太频繁,防止服务端由于客户端太多,上传太频繁而宕机。

由于工作繁忙,先到这,以后出现问题,再重构吧。

Windows服务器入侵排查:系统日志与FTP日志分析实战 在服务器安全领域,日志分析是追踪攻击行为、还原事件真相的核心技术。其原理在于操作系统和应用服务会持续记录用户操作、系统事件和网络活动,形成可追溯的审计线索。这项技术的价值在于能够突破单一数据源的局限,构建完整的攻击链条视图,对于应急响应和威胁狩猎至关重要。典型的应用场景包括服务器性能异常排查、恶意活动检测和数据泄露溯源。本文聚焦于一次真实的Windows服务器安全事件,深入剖析了如何通过Windows系统日志和FTP服务日志这两类常被忽视的关键数据源,有效补充传统Web日志分析的不足,从而精准定位攻击入口、 阅读详情

相关推荐

Spring Boot Base64文件上传:从解码到生产级安全存储全解析

Base64编码是一种将二进制数据转换为ASCII字符串的编码方案,常用于在文本协议(如JSON、XML)中安全传输文件数据。其原理是将每3个字节的二进制数据编码为4个可打印字符,便于网络传输且避免数据损坏。在Web开发中,这种技术价值在于能够无缝集成文件上传功能到基于JSON的RESTful API中,尤其适用于图片处理、Canvas绘图输出等前端直接生成Base64数据的场景。然而,直接将Base64字符串解码存储为文件,会面临内存溢出、恶意文件上传、存储扩展性等工程挑战。本文以Spring Boot框

weixin_34377919的博客 502

stm32 Can通讯过滤器寄存器设置(实验验证)

起因:在使用stm32单片机can通讯时,参考手册的介绍与寄存器封装有差别,不好理解怎么去设置寄存器。在参考一些代码时,对怎么去设置过滤器还是难以理解。 解决: 在寄存器封装库中,我们发现CAN过滤器设置寄存器封装有CAN1->sFilterRegister[ x ].FR1 和 CAN1->sFilterRegister[ x ].FR2 两个寄存器,其封装如下:type

u013984214的专栏 3288

FTP传输错误解决方法(FTP无法传输)

FTP传输文件、图片失败解决方法

moshi_6的博客 8086

CloudCompare实战:5分钟搞定点云数据预处理(含常见格式转换技巧)

本文提供了一套基于CloudCompare的5分钟点云数据预处理实战指南。文章详细讲解了如何利用这款开源工具,快速完成点云数据的格式转换(如LAS转PLY)、统计离群值降噪、体素网格下采样以及交互式裁剪等核心操作,帮助用户高效清理和规整杂乱数据,为后续分析建模奠定基础。

weixin_29207533的博客 477

STM32F103C8T6 Bootloader开发实战:串口IAP固件升级与Keil工程配置详解

本文详细介绍了STM32F103C8T6 Bootloader开发实战,重点讲解串口IAP固件升级的实现方法与Keil uVision5工程配置。通过Flash分区管理、USART1通信协议设计及应用程序跳转机制等核心技术,帮助开发者掌握嵌入式系统固件升级方案,提升设备维护效率。

weixin_29165725的博客 437

FTP的操作

1.主动被动操作。 reqFTP.UsePassive = false; 主动操作被动操作为 true

weixin_40029679的博客 377

4、设备树的处理(1)

其实到第4节才写设备树的问题完全是因为忘记了,之前有一个版本是先关闭了设备树的,习惯性的认为设备树已经处理完了,失误了!!!前文说过,这个系统是依着荣品的开发板和核心板来的,使用的是5.1内核的SDK。它的SDK里是开发板全功能的,所以设备树也是的。

wsen2012的博客 417

C# FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误...

FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误 解决方法是在原代码上增加这句话 reqFTP.UsePassive = false; /// <summary> /// 上传 /// </summary> pu...

weixin_30399797的博客 1385

[xboard-ok210] 44 s5pv210开发板介绍和对比

文章目录前言四大S3C6410提供商友坚开发板UT-S5PV210华天正(润尔)real210飞凌开发板ok210九鼎x210友善之臂开发板tiny210mini210smart210天嵌开发板tq210sate210xboardxboardxboard之ok210 前言 四大S3C6410提供商 友坚开发板 UT-S5PV210 华天正(润尔) real210 飞凌开发板 ok210 九鼎 x210 友善之臂开发板 tiny210 mini210 smart210 天嵌开发板 tq210 sate210

鹰之翔 286

DeepSeek掘金——用DeepSeek模型构建AI 代理

在本综合指南中,我们将探讨如何利用 DeepSeek 的功能构建能够以有意义的方式理解、推理和交互的复杂 AI 代理。人工智能领域正在迅速发展,DeepSeek 的模型代表了智能 AI 代理开发的重大进步。在本综合指南中,我们将探讨如何利用 DeepSeek 的功能构建能够以有意义的方式理解、推理和交互的复杂 AI 代理。

3860

ftp上传文件报错 Unexpected null reply received

记一次ftp上传文件失败报错 Caused by: java.io.IOException: Unexpected null reply received at com.enterprisedt.net.ftp.FTPControlSocket.readReply(FTPControlSocket.java:487)

wanli_6的博客 686

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

FTP上传文件,报“系统错误,java编程思想电子书

// 上传文件时通知服务器文件的大小 reqFTP.ContentLength = fileInf.Length; reqFTP.Timeout = 30000; // 缓冲大小设置为2kb int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; FileStream fs = null; Stream strm = null; try { FileUtil.getInstance().backupLog(“111

m0_63102527的博客 170

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

由Ftp引起的问题

在MVC2中使用ftp上传文件、用FtpWebRequest封装的客户端在程序中调用,却出现这么个问题,当web站点和ftp站点放在一个IIS中, 上传文件大概25个左右,程序就会卡死,浏览器也会卡住不动,这时查看ftp的会话连接是25个,我设置ftp的会话连接是1000,那么先排除不是ftp会话连接限制的问题,有没有可能是别的地方有限制呢? 我把web站点和ftp站点分开搭建,则不会出现这个问题

萌萌的It人 www.itmmd.com 1250

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Use MVS Dsbame convensions. windows下ftp.exe客户端上传错误

环境:主机 220-FTPD1 IBM FTP CS V1R11 at BT11  +  windows下的ftp.exe客户端 现象:windows下ftp.exe命令上传文件,报"Use MVS  Dsbame convensions." 错误 原因: 主要是IBM FTP Server 文件系统的命名规范造成的: 8个基本字符 解决: 通过 cd '根目录.目录1.目录2----'进入...

weixin_33901926的博客 122

由于找不到appvisvsubsystems64.dll_ftp,ftp软件搜索不到

FTP作为一款服务器文件管理软件非常好用,现在常见的FTP软件有很多,但是功能都是一样的,只有操作界面大同小异。FTP软件的体积通常非常小,基本上都在几十兆以内,所以非常方便,基本上不管是做网站运维的,还是做程序开发的,都会有一款自己常用的FTP软件。IIS7服务器管理工具可以批量管理、定时上传下载、同步操作、数据备份、到期提醒、自动更新。IIS7服务器管理工具适用于Windows操作系统和liu...

weixin_39779032的博客 4246

FtpWebRequest实战总结

Ftp通过网络传输,用流文件的方式上传,特别在验证路径时,通过拆分每一级目录,对每级目录上传和删除的操作,增加网络和IO的消耗,操作FTP服务器频率高导致的偶尔失败。最简单并且能马上解决问题的办法是封装上方循环目录的部分代码,在try和catch里分别调用一次,可减少该问题发生的概率。我使用的第二种方式,本地测试过程是没有问题的。但没有考虑到现场复杂性,整个流程单次进行能正常运行,流程一个接一个时,这里就报错,导致图片上传老是漏几张。上传图片前需验证当前路径,如果不存在,要创建路径后再写入流文件。

shanshan2099的专栏 1203

centos下部署apache服务开发环境和ftp服务

Centos配置apache环境: Linux CentOS 如何快速部署Web服务器-Apache篇 By Paipat Under 环境搭建   之前讲过《linux centos 如何快速部署web服务器-Apache篇》现在就讲讲centos 如何部署Apache,让简单的网站运行。本节比较简单,在非编译下安装,可以满足新手用户的需求。 演示环境:Linux CentOS 6.3 ...

u010817136的专栏 796

c#-ftps-ssl

c# 操作ftps 问题

likecsda的专栏 572

利用struts2上传文件时,如果文件名中含有-符号,那么会出错

利用struts2上传文件时,如果文件名中含有-符号,那么会出错 报错如下: HTTP Status 500 - C:\Program Files\Apache Software Foundation\Tomcat 6.0\work\Catalina\localhost\dqzx\upload_2de065e9_14fd3bcae34__8000_00000101.tmp (系统找不到指...

weixin_34001430的博客 123

常用的aix命令

登陆 cmd->telnet 10.122.149.1 修改密码 #passwd 关机 #shutdown #shutdown –F 重启计算机 #shutdown –Fr 进入目录 #cd app(目录名) 回退: #cd .. 查看设备状态 #lsdev -Cc disk查看磁盘是否可用 #lsdev -Cc adapter查看适配器是否可用 #lsdev -C

cyxlxp8411的专栏 428

网络运维与网络安全 阶段一 基础篇八

个人学习成长,不涉及利益交换,希望共同学习成长,为社会及家庭贡献力量。 2025.11.15 (阶段一 基础篇八)

2502_93779695的博客 366

《星球大战:亡命之徒》游戏闪退黑屏提示“找不到libcurl.dll”该怎么解决?星球大战亡命之徒游戏崩溃弹窗“缺少libcurl.dll”的修复之道

libcurl.dll 是cURL库的一部分,它是一个用于处理URL传输的强大工具库,支持包括HTTP、HTTPS、FTP等多种协议。libcurl.dll 提供了简单的API来执行网络请求,如下载文件、上传数据、处理cookies和认证等。它广泛应用于各种编程语言中,帮助开发者轻松实现网络通信功能。此外,libcurl.dll 还支持SSL加密和代理服务器,使其成为开发需要网络功能的应用程序的理想选择。如果缺少或损坏该文件,可能会导致应用程序无法正常执行网络请求。

Phaethons的博客 1112
上一篇: Spring Boot常用注解(绝对经典)
下一篇: spring aop原理
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2953原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值