C#接收文件流通过SFTP上传至服务器

该博客介绍了如何使用C#作为服务端接口,接收第三方通过文件流上传的vox文件,并利用Renci.SshNet库,实现文件流通过SFTP协议上传到多台Linux服务器。接口支持同时上传多个文件,可以使用Postman进行测试,配置信息如SFTP连接详情等存储在web.config中。

C# 做服务端接口,接收文件流通过SFTP上传至服务器

本示例支持多个文件上传同时上传,并同时上传多台服务器

SFTP需要引入Renci.SshNet包
接口功能:第三方调用此接口上传vox文件,接口接收传过来的文件流,直接将接收的文件流通过SFTP的方式上传至Linux服务器
可用Postman进行自测

Body选择form-data方式
Body

Content-Type:multipart/form-data 在这里插入图片描述

接口的入口,逻辑处理在upLoadFile()中:
public class CCase
    {
        /// <summary>
        /// 预约服务
        /// </summary>
        /// <param name="stream"></param>
        [WebInvoke(UriTemplate = "upLoadFile", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
        //public SampleItem Create(SampleItem instance)
        public void upLoadFile(Stream stream)
        {

            string ip = System.Web.HttpContext.Current.Request.UserHostAddress.ToString();
            string rval = "";
            Encoding gbEncoding = Encoding.GetEncoding("utf-8");

            try
            {
                CTrace.Write(TraceLevel.Info, "upLoadFile.Receive.....{0}", ip);
                //StreamReader sr = new StreamReader(stream, gbEncoding);
                //string s = sr.ReadToEnd();
                //sr.Dispose();
                CTrace.Write(TraceLevel.Info, "upLoadFile.Readstr:{0}", rval);
                rval = CsDataHandler.upLoadFile(stream);
            }
            catch (Exception err)
            {
                CTrace.Write(TraceLevel.Debug, "upLoadFile.Read.Err::{0}", err.ToString());
                return;
            }

            try
            {
                CTrace.Write(TraceLevel.Info, "upLoadFile.Write:{0}", rval);

                HttpContext.Current.Response.ContentEncoding = gbEncoding;
                HttpContext.Current.Response.Write(rval);
            }
            catch (Exception err)
            {
                CTrace.Write(TraceLevel.Debug, "upLoadFile.Write.Err::{0}", err.ToString());
            }

        }
    }
接口业务逻辑:
public class CsDataHandler
    {
        public CsDataHandler() { }

        /// <summary>
        /// 将json数据反序列化为Dictionary
        /// </summary>
        /// <param name="jsonData">json数据</param>
        /// <returns></returns>
        public static Dictionary<string, object> JsonToDictionary(string jsonData)
        {
            //实例化JavaScriptSerializer类的新实例
            JavaScriptSerializer jss = new JavaScriptSerializer();
            try
            {
                //将指定的 JSON 字符串转换为 Dictionary<string, object> 类型的对象
                return jss.Deserialize<Dictionary<string, object>>(jsonData);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public static string upLoadFile(Stream context)
        {
            CTrace.Write(TraceLevel.Info, "upLoadFile.in......");
            try
            {
                MultipartFormDataParser parser = new MultipartFormDataParser(context);
                if(parser != null && parser.Files.Count > 0)
                {
                    CTrace.Write(TraceLevel.Info, "upLoadFile.HasFile......");
                    string fileName = "";
                    foreach(var content in parser.Files)
                    {
                        //获取上传文件名称
                        fileName = content.FileName;
                        byte[] chrBuffer = new byte[1024];

                        //获取文件扩展名
                        string extension = Path.GetExtension(fileName);
                        if(extension != ".vox")
                        {
                            return GetFaildJsonEX("1002", "文件类型错误");
                        }
                        int intReadLength = 0, intFileLength = 0;
                        Stream fileContent = content.Data;
                        do
                        {
                            intReadLength = fileContent.Read(chrBuffer, 0, 1024);
                            intFileLength += intReadLength;
                        }
                        while (intReadLength == 1024);
                        //文件上传限制为5M
                        if(intFileLength > 5242880)
                        {
                            return GetFaildJsonEX("1004", "文件不能超过5M");
                        }
                        Stream fileContent = content.Data;
                        CTrace.Write(TraceLevel.Info, "upLoadFile.Read<Done>......");
                        //创建SFTP连接
                        string sftpPort = ConfigurationManager.AppSettings["sftpPort"].ToString();
                        string sftpUser = ConfigurationManager.AppSettings["sftpUser"].ToString();
                        string sftpPwd = ConfigurationManager.AppSettings["sftpPwd"].ToString();
                        string sftpPath = ConfigurationManager.AppSettings["sftpPath"].ToString();
                        CTrace.Write(TraceLevel.Info, "upLoadFile.SFTP Connect......");
                        //获取上传服务器数量
                        int sftpCount = int.Parse(ConfigurationManager.AppSettings["sftpCount"].ToString());
                        string ret = "";
                        int expt = 0;
                        //多台服务器同时上传
                        for(int i = 0; i < sftpCount; i++)
                        {
                            string configHostName = "sftpHost" + i.ToString();
                            string sftpHost = ConfigurationManager.AppSettings[configHostName].ToString();
                            try
                            {
                            	fileContent.Seek(0, SeekOrigin.Begin);
                                SftpClient sftpClient = new SftpClient(sftpHost, Int32.Parse(sftpPort), sftpUser, sftpPwd);
                                sftpClient.Connect();
                                sftpClient.UploadFile(fileContent, sftpPath + fileName);
                                sftpClient.Disconnect();
                                CTrace.Write(TraceLevel.Info, "upLoadFile.SFTP Done......");
                            }
                            catch (Exception e)
                            {
                                expt++;
                                ret += "第" + i + "台网关<Failed>" + e.ToString() + "--";
                            }
                        }
                        //所有服务器都上传失败
                        if(expt == sftpCount)
                        {
                            return GetFaildJsonEX("1005", ret);
                        }
                    }
                    return GetOKJson();
                }
                else
                {
                    return GetFaildJsonEX("1001", "获取文件失败");
                }
            }
            catch (Exception e)
            {
                return GetFaildJsonEX("1002", e.ToString());
                throw;
            }
        }
        public static string GetOKJson()
        {
            return JsonConvert.SerializeObject(new
            {
                CODE = "0000",
                CAUSE = "success"
            });
        }
        public static string GetFaildJsonEX(string code, string msg)
        {
            return JsonConvert.SerializeObject(new
            {
                CODE = code,
                CAUSE = msg
            });
        }

        /// <summary>
        /// 转换日期
        /// </summary>
        /// <param name="d"></param>
        /// <returns></returns>
        public static DateTime ConvertLongToDateTime(long d)
        {
            DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
            long lTime = long.Parse(d + "0000");
            TimeSpan toNow = new TimeSpan(lTime);
            DateTime dtResult = dtStart.Add(toNow);
            return dtResult;
        }

    }

SFTP连接地址、上传服务器数量、端口、用户名、密码、文件路径均配置在web.config中。

内容概要:本文针对T型三电平逆变器在电网电压跌落条件下的低电压穿越(LVRT)问题,提出了一种结合改进电流解耦控制与直流侧中点电位平衡的综合控制策略。通过建立逆变器的数学模型,采用双二阶广义积分器(DSOGI)实现电网电压正负序分量的精确分离,并在此基础上设计自适应无功支撑与故障电流限幅控制,以满足LVRT对无功补偿和电流安全性的要求。为提升不对称故障下的动态性能,引入改进的正负序解耦电流控制方法,有效克服传统PI控制器在耦合干扰下的控制滞后问题。同时,结合零序电压注入法对中点电位进行主动调控,抑制中点电压漂移,保障系统长期稳定运行。整个控制方案在Simulink平台上完成建模与仿真验证,结果表明该方法在电网故障期间具有优良的动态响应特性、稳定的中点电位控制能力和可靠的并网运行性能。; 适合人群:具备电力电子、自动控制或新能源并网技术背景,从事逆变器控制算法开发、微电网系统集成或可再生能源发电系统研究的工程技术人员及高校研究生。; 使用场景及目标:①用于提升T型三电平逆变器在电网故障条件下的并网可靠性与电能质量;②为高比例新能源接入场景下的LVRT控制策略设计提供理论支撑与技术路径;③适用于需要实现高性能电流控制与中点电位稳定的工业级变流器控制系统开发。; 阅读建议:建议结合提供的Simulink仿真模型进行学习,重点剖析正负序分离、改进电流解耦控制环设计及中点电位平衡模块的协同工作机制,可通过设置不同类型的电网故障(如单相短路、两相短路)和调节控制参数开展对比实验,深入掌握各模块对系统整体性能的影响规律。
内容概要:本文针对不对称电网故障条件下T型三电平逆变器的低电压穿越(LVRT)问题,提出了一种多目标协同控制策略,并通过Simulink平台实现了系统仿真验证。该策略综合考虑了故障期间电网电压跌落应对、正负序电流的精确解耦控制以及直流侧中点电位稳定三大关键问题,构建了多层次、多目标协同控制架构。通过引入双二阶广义积分器(DSOGI)实现电网电压正负序分量的快速、准确分离,结合改进的正负序解耦电流控制环路设计,有效抑制负序电流对系统的影响并保障并网电能质量;同时,采用零序电压注入法实现中点电位主动平衡控制,解决了传统控制中电位漂移导致器件应力不均的问题。整体控制方案提升了逆变器在复杂不对称故障下的运行稳定性与可靠性。; 适合人群:从事电力电子、新能源并网、电力系统自动化等领域的科研人员与工程技术人员,以及具备一定Simulink仿真基础和电力系统分析能力的研究生或高年级本科生。; 使用场景及目标:①深入研究T型三电平逆变器在不对称电网故障下的动态响应特性与控制挑战;②掌握低电压穿越、正负序电流解耦控制、中点电位平衡等核心技术的协同设计方法与实现原理;③为高性能逆变器控制系统在实际工程中的设计、优化与仿真验证提供理论依据和技术参考。; 阅读建议:建议结合文中详细的控制策略理论分析与Simulink模型结构图进行对照学习,重点关注双二阶广义积分器、正负序电流环设计、零序电压注入模块及SVPWM调制单元的实现细节,通过调整仿真工况并分析实验结果,深入理解各控制环节的协同作用机制与系统整体性能表现。
内容概要:本文研究了一种基于阶跃响应的V-Tiger自动增益调整PID控制器优化方法,旨在通过Matlab代码实现对PID控制器参数的智能化自动整定。文章系统阐述了PID控制的核心性能指标、V-Tiger自动增益控制器的技术原理以及阶跃响应整定的基础理论,提出了一种融合阶跃响应特征提取与多目标协同优化策略的自动整定方案,并引入自适应迭代校正机制以提升控制精度与系统鲁棒性。所提方法通过采集被控对象的阶跃响应曲线,提取关键动态特征参数,结合多目标优化算法实现比例、积分、微分增益的协同寻优,有效解决了传统手动整定效率低、适应性差的问题。仿真实验结果表明,该方法在动态响应速度、抗干扰能力及系统稳定性方面均表现出优越性能,具有较强的工程应用价值。; 适合人群:具备自动控制理论基础和Matlab编程能力,从事控制工程、自动化、电气工程及相关领域的科研人员、工程师以及高校研究生。; 使用场景及目标:①适用于工业过程控制、电机驱动、电力电子变换器等需高精度PID参数整定的实际工程场景;②目标在于实现PID控制器的智能化、自动化参数整定,降低对专家经验的依赖,减少人工调试成本,提升控制系统的动态响应品质与运行稳定性;③为科研工作者提供一套可复现、可扩展的Matlab代码框架,便于开展后续算法改进与工程化应用研究。; 阅读建议:建议读者结合文中理论推导与提供的Matlab代码进行同步学习,重点关注阶跃响应特征提取方法与多目标优化策略的设计逻辑,通过仿真实验对比不同整定方法的控制效果,深入理解V-Tiger算法的工作机制及其在复杂控制系统中的应用技巧。
内容概要:本文围绕DoS攻击下孤岛微电网的分布式二次协同控制问题,提出了一种混合动态事件触发的弹性控制策略,并通过Simulink仿真平台进行了完整复现。研究聚焦于在网络安全威胁(如拒绝服务攻击)环境下,如何保障微电网频率与电压的稳定恢复,采用了分层控制架构与事件触发机制相结合的方法,有效降低通信负担的同时提升系统鲁棒性。文中详细构建了包含多个分布式发电单元的微电网模型,设计了基于一致性算法的分布式控制器,并引入动态事件触发机制以优化资源利用,避免不必要的通信开销。该方案不仅实现了二次控制目标,还在面对DoS攻击导致的信息中断时展现出良好的容错能力和稳定性,体现了较强的工程应用价值。; 适合人群:具备电力系统自动化、控制理论基础及一定Simulink仿真经验的研究生、科研人员以及从事微电网、智能电网相关领域的工程师。; 使用场景及目标:① 学习和掌握孤岛微电网在网络安全威胁下的弹性控制设计方法;② 理解事件触发机制在分布式控制中的应用优势;③ 复现并改进SCI级别期刊中的先进控制策略,服务于科研论文写作与项目开发。; 阅读建议:建议结合提供的Simulink模型与代码资源,逐步调试仿真流程,重点关注控制器参数设置、事件触发条件设计及其对系统性能的影响,同时可进一步拓展至其他类型网络攻击场景下的防御机制研究。
内容概要:本文针对低温环境下微电网的优化调度问题,深入研究了电池寿命损耗对系统运行的影响,提出了一种综合考虑电池老化特性与系统经济性的优化调度模型。通过Matlab代码实现了该模型的仿真分析,创新性地构建了适用于低温工况的电池寿命损耗量化模型,并将其融入微电网能量管理策略中。研究不仅追求运行成本最小化,更强调储能系统长期运行的可靠性与可持续性,有效提升了微电网在恶劣气候条件下的适应能力。文中详述了模型的构建逻辑、约束条件设定、多目标函数设计及求解方法,并通过仿真案例验证了所提策略在降低综合成本、延缓电池衰减方面的优越性能。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、储能系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于寒冷地区微电网能量管理系统的设计与优化;②为考虑储能设备寿命折损的综合调度策略研究提供理论模型与代码实现参考;③服务于高水平科研论文复现、课题申报及实际工程项目前期仿真验证。; 阅读建议:建议读者结合Matlab代码与文中模型描述同步研读,重点关注电池寿命损耗模型的数学推导与程序实现细节,并尝试调整环境温度、充放电倍率等关键参数,观察其对调度结果和电池老化速率的影响,从而深入理解多目标权衡机制与低温环境对微电网运行的核心挑战。
内容概要:本文研究了一种可切换构网型与跟网型的逆变器双向平滑切换控制策略,并基于Simulink平台进行了仿真验证。针对新型电力系统中构网型和跟网型逆变器各自在不同运行场景下的优势与局限,提出一种能够在两种模式之间实现无缝切换的控制方法,确保系统在模式转换过程中频率、电压及功率的平稳过渡。文中详细阐述了控制策略的设计原理,包括模式识别、切换判据、过渡过程控制以及稳定性保障机制,重点解决了切换瞬间可能出现的功率冲击、相位失步和暂态振荡等关键问题。通过构建典型的微电网仿真模型,设置多种工况(如负载突变、模式指令切换等)对所提策略进行验证,结果表明该策略能够有效实现双向平滑切换,显著提升了系统的运行灵活性与动态稳定性。; 适合人群:具备电力电子、自动控制或新能源发电系统基础知识的研究生、科研人员及从事微电网、储能系统开发的工程技术人员。; 使用场景及目标:①用于研究构网型与跟网型逆变器的协同控制与模式切换机制;②为高比例新能源电力系统中逆变器的灵活运行与稳定控制提供技术参考;③作为Simulink仿真实践案例,辅助相关课程教学或课题研究。; 阅读建议:读者应结合Simulink仿真模型深入理解控制逻辑的实现细节,重点关注切换判据的设计与过渡过程的动态响应,建议动手复现仿真以加深对平滑切换关键技术要点的掌握。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值