C#中应用PSFTP实现SFTP上传

上传

SFTP,第一次听说,还以为是公司自己搞得一个东东呢,google了一下,原来是一种FTP协议,是可信任的FTP,类似于HTTPS协议。

这次项目就是要将一些数据文件打包通过SFTP传到德国的Server,所以中途是需要加密传输的,即通过SFTP进行数据的上传动作。

找了一个开源的东东,PSFTP,是一个绿色EXE档,C#中控制也很方便,于是自己封装了一下方便自己的应用。

PSFTP的命令是典型的Unix命令,很简单易懂 ,下面是其基本的命令:

C#中使用Process调用该EXE实现FTP的上传,参数如下:

C#中调用方式如下:

Upload#region Upload
/**//// <summary>
/// Upload the files
/// </summary>
/// <returns>output of the plugin during its running in console</returns>
public string Upload()
...{
    string outPutMessage = "";
    string scriptLocation = "";

    //Create Script File
    scriptLocation = this.CreateScriptFile();

    Begin for ProcessStartInfo#region Begin for ProcessStartInfo
    //Run the Upload event
    ProcessStartInfo processInfo = new ProcessStartInfo();
    //Set the Shell Command(the plugins' path)
    processInfo.FileName = this.m_ShellCommand;
    //Don't show console window
    processInfo.CreateNoWindow = true;
    //don't use shell to execute this script
    processInfo.UseShellExecute = false;      
    //Open Process Error Output
    processInfo.RedirectStandardError = true; 
    //Open Process Input
    processInfo.RedirectStandardInput = true; 
    //Open Process Output
    processInfo.RedirectStandardOutput = true;
    //Get process arguments
    string arguments = "";
    arguments += this.m_UserID + "@" + this.m_ServerName + " "; //Login Server with specified userid
    arguments += "-pw " + this.m_Password + " "; //Login with specified password
    arguments += "-P " + this.m_Port + " "; //Connect to specified port
    arguments += "-b " + scriptLocation + " "; //use specified batchfile
    arguments += "-be"; //don't stop batchfile processing if errors
    processInfo.Arguments = arguments;
    #endregion
    //Create new Process
    Process process = new Process();
    try
    ...{
        //Start execute the ProcessStartInfo
        process.StartInfo = processInfo;
        //Run the process
        process.Start();
        //Input "y" for the psftp's first login prompt
        //Just for the security information
        process.StandardInput.WriteLine("y");

        //Get the return message from process(Error and Output information)
        //This message will be logged to file for debug!
        outPutMessage += process.StandardOutput.ReadToEnd();
        outPutMessage += process.StandardError.ReadToEnd();
        //Wait for the process exit
        process.WaitForExit();
        //Close all the modules opened
        process.Close();
        process.Dispose();
        //Delete the script file
        File.Delete(scriptLocation);
        return outPutMessage;
    }
    catch(Exception ex)
    ...{
        process.Dispose();
        //Delete the script file
        File.Delete(scriptLocation);
        throw new Exception("Error occured during upload file to remote server!",ex);
    }
}
#endregion

CreateScriptFile#region CreateScriptFile
/**//// <summary>
/// Create Batch Script File
/// </summary>
/// <returns>file full path</returns>
private string CreateScriptFile()
...{
    StreamWriter fileStream;
    string scriptLocation = "";
    //Get the Batch Script to execute
    StringBuilder sbdScript = new StringBuilder();
    //Redirect to the default remote location
    sbdScript.Append("cd " + this.m_RemoteLocation + Environment.NewLine);
    //Upload files
    foreach(object file in this.m_UploadFiles)
    ...{
        sbdScript.Append("put " + (string)file + Environment.NewLine);
    }

    //Close the session
    sbdScript.Append("quit");
    //Save the Script to templocation
    scriptLocation = this.m_TempLocation + @"" + System.Guid.NewGuid().ToString() + ".scr";

    try
    ...{                
        fileStream = new StreamWriter(scriptLocation);
        fileStream.Write(sbdScript.ToString());
        fileStream.Close();
    }
    catch(Exception ex)
    ...{
        fileStream = null;
        throw new Exception("Error occured during create script file!",ex);
    }
    return scriptLocation;
}
#endregion

时间: 2024-12-30 12:05:42

C#中应用PSFTP实现SFTP上传的相关文章

如何在 Linux 中使用 sFTP 上传或下载文件与文件夹

sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全:它通过加密 SSH 传输处理所有操作. 它可以配置使用几个有用的 SSH 功能,如公钥认证和压缩. 它连接并登录到指定的远程机器,然后切换到交互式命令模式,在该模式下用户可以执行各种命令. 在本文中,我们将向你展示如何使用 sFTP 上传/下载整个目录(包括其子目录和子文件). 如何在 Linux 中使用 sFTP 传输文件/文件夹 默认情况下,SFTP 协

图片-通过jsp页面上传图,路径保存到oracle中,怎么能在上传的时候把文件的名字改成自己想要的

问题描述 通过jsp页面上传图,路径保存到oracle中,怎么能在上传的时候把文件的名字改成自己想要的 图片保存到磁盘后,当我想换掉这个图片时,用什么方法可以用新的图片覆盖掉老图片 解决方案 一般存路径就是文件改过名字的路径,再次保存新图片,取得原来的路径删除呗,然后在存 解决方案二: 上传的时候重命名同时将文件路径的信息保存到数据库. 硬盘保存文件 . 解决方案三: 用文件流写文件的时候路径不就是名字 解决方案四: 上传的时候用自己想要的名字存在服务器上就行了

wpf-WPF 项目中如何实现文件的上传和下载

问题描述 WPF 项目中如何实现文件的上传和下载 WPF 项目中如何实现文件的上传和下载功能,本人WPF初学者,求大神给一两个简单易懂的例子. 解决方案 参考WPF用流的方式上传/显示/下载图片文件(保存在数据库)WPF文件上传与下载功能 解决方案二: http://silverlightchina.net/html/study/WPF/2011/0512/7580.html http://www.th7.cn/Article/bc/wpf/201105/20110524082359.html

ASP.NET开发中怎么实现多图片上传并浏览的功能

问题描述 ASP.NET开发中怎么实现多图片上传并浏览的功能 ASP.NET开发中怎么实现多图片上传并浏览的功能,可以用什么控件来做? 解决方案 用jquery或者flash,自带的控件好像是不可以 解决方案二: 可以试试Aurigma Upload Suite,功能挺强大的一款图文上传控件,有多个版本,可以根据自己的需求进行选择.

php中使用jquery uploadify 无法上传视频文件问题

问题描述 php中使用jquery uploadify 无法上传视频文件问题 快疯掉了 同样的代码上传图片打印出来就有数据没问题 但是我改成视频 就会这样 希望能解答一下 跪谢 解决方案 我刚发表了一篇此类文章. 你是用的集成软件还是自己搭的环境? 我是nginx服务器上修改的php.ini除了重启服务器之外还要重启fastcig进程管理器php-fpm 解决方案二: 估计跟视频的大小相关. 打印phpinfo 查看upload_max_filesize和post_max_size 解决方案三:

domino 中web 下跨库上传附件怎么实现???

问题描述 domino中web下跨库上传附件怎么实现???欢迎大家加入dominoQQ技术群:34776043讨论, 解决方案 解决方案二:具体要实现什么啊?解决方案三:说说你想实现什么.如果只是说想要在一个库存一个附件到另外一个库里,应当比较容易.解决方案四:ID关联即可.

.net 实现图片上传的同时在网页中显示,主要是上传控件没有事件,想不出怎么弄,求大手指点

问题描述 .net实现图片上传的同时在网页中显示,主要是上传控件没有事件,想不出来怎么弄,求大手指点 解决方案 解决方案二:如果你是用的服务器控件,那也有事件的啊如果你不是的话,那就要用js来通知更新,可以的方法有:1.后台返回js,更新指定img2.前端定时轮询,超出次数则提示上传失败

Bootstrap中的fileinput 多图片上传及编辑功能_javascript技巧

大家如果对Bootstrap-fileinput 的配置不清楚的话,大家可以查看官方网站:http://plugins.krajee.com/file-input. 逻辑说明:先从后台获取数据展示,然后进行编辑. 废话不多说, 直接上代码. 1. 页面部分代码: <div class="form-group"> <label for="inputEmail3" class="col-xs-3 control-label">

Struts2中图片以base64方式上传至数据库_java

1.页面 这里输入代码 <div> <span id="uploadImg" style="margin:50px;background-color:#ddd;display:inline-block;height:130px;width:200px;"> <span style="color:#bbb;font-weight:600;border:2px #ccc dashed;font-size:20px;text-ali