C# 做服务端接口,接收文件流通过SFTP上传至服务器
本示例支持多个文件上传同时上传,并同时上传多台服务器
SFTP需要引入Renci.SshNet包
接口功能:第三方调用此接口上传vox文件,接口接收传过来的文件流,直接将接收的文件流通过SFTP的方式上传至Linux服务器
可用Postman进行自测
Body选择form-data方式

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

1120

被折叠的 条评论
为什么被折叠?



