FTPHelperNew.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.IO;
  6. using System.Net;
  7. using System.Windows.Forms;
  8. using System.Xml.Linq;
  9. using Newtonsoft.Json;
  10. using System.Xml;
  11. using System.Text;
  12. using System.Net.Sockets;
  13. namespace prBrowser.Weblogic
  14. {
  15. public class FTPHelperNew
  16. {
  17. public string currentPath = "";
  18. public string serverPath = "";
  19. public string serverFTPName = "PRFTP";
  20. public string serverFTPPassword = "pryk@2020";
  21. public string ftpDefaultFolder = "browser";
  22. public string hipIP = "http://10.204.72.74:8090";
  23. public string hipURL = "/bdhealth/";
  24. public string hipAuthorization = "Basic aGlwdXNlcjpob3NwSW5mb1BUIUAj";
  25. public string versionNumberFileName = "UpdateList\\versionNumber.xml";
  26. public string doUpdate(string inParams)
  27. {
  28. //System.Diagnostics.Debugger.Launch();
  29. string logString = "开始调用更新程序0:------------------------------------------------------------------------------------------";
  30. Log.LogInfo(logString, "doUpdate");
  31. Log.LogInfo(inParams, "doUpdate");
  32. string errorCode = "0";
  33. string errorMessage = "";
  34. JObject jObject = new JObject();
  35. try
  36. {
  37. JObject inputEmpParamsObj = JObject.Parse(inParams);
  38. var paramsdata = inputEmpParamsObj["params"][0];
  39. hipIP = paramsdata["hipIP"].ToString(); //hipIP
  40. hipURL = paramsdata["hipURL"].ToString(); //URL
  41. hipAuthorization = paramsdata["hipAuthorization"].ToString(); //hipAuthorization
  42. currentPath = AppDomain.CurrentDomain.BaseDirectory;
  43. serverPath = getXMLValue("prBrowser.exe.config", "UpdateUrl");
  44. string UpdateList = CheckUpdate(inParams);
  45. if (UpdateList != "[]")
  46. {
  47. if ((serverPath == "") || (serverPath == null) || (serverPath == string.Empty))
  48. {
  49. jObject.Add("errorCode", "-1");
  50. jObject.Add("errorMessage", "ftp:地址为空");
  51. Log.LogInfo(jObject.ToString(), "doUpdate");
  52. return jObject.ToString();
  53. }
  54. ///判断ftp地址通不通
  55. string[] sArray = serverPath.Split(new string[1] { ":" }, StringSplitOptions.None);
  56. string ftpip = sArray[1].ToString().Replace("/", "");
  57. string ftpport = sArray[2].ToString().Replace("/", "");
  58. serverPath = "ftp://" + ftpip + ":" + ftpport + "/";
  59. string checkinfo = CheckLinkFtp(ftpip, serverFTPName, serverFTPPassword, ftpport);
  60. JObject checkinfoobj = JObject.Parse(checkinfo);
  61. errorCode = checkinfoobj["errorCode"].ToString();
  62. if (errorCode != "0")
  63. {
  64. errorMessage = checkinfoobj["errorMessage"].ToString();
  65. jObject.Add("errorCode", errorCode);
  66. jObject.Add("errorMessage", errorMessage);
  67. Log.LogInfo(jObject.ToString(), "doUpdate");
  68. return jObject.ToString();
  69. }
  70. ///下载文件
  71. JArray Updataarray = new JArray();
  72. var UpdateListObj = JArray.Parse(UpdateList);
  73. foreach (var result in UpdateListObj)
  74. {
  75. string hipdllname = result["dllname"].ToString(); //文件名
  76. string toaddress = result["toaddress"].ToString(); //to文件地址
  77. string fromaddress = result["fromaddress"].ToString(); //from文件地址
  78. string hipversionNumber = result["versionNumber"].ToString(); //版本号
  79. //string rtn = DownLoad(下载到哪的路径", 下载的文件名, 从哪下载, serverFTPName, serverFTPPassword);
  80. //string uri = serverPath + ftpDefaultFolder + "/UpdateList/";
  81. toaddress = ((!(toaddress == "")) ? (toaddress + "\\") : "\\");
  82. fromaddress = ((!(fromaddress == "")) ? ("\\" + fromaddress + "\\") : "\\");
  83. string toPath = currentPath + toaddress; //放到那个文件夹
  84. string fromPath = serverPath + ftpDefaultFolder + fromaddress.Replace("\\", "/"); //从哪个文件夹下载
  85. string rtn = DownLoad(toPath, hipdllname, fromPath, serverFTPName, serverFTPPassword);
  86. if (rtn == "0")
  87. {
  88. Updataarray.Add(result);
  89. errorMessage = errorMessage + ";" + hipdllname;
  90. }
  91. }
  92. //下载完成更新 更新列表xml
  93. if (Updataarray.ToString() != "[]")
  94. {
  95. SetUpdateList(Updataarray.ToString());
  96. }
  97. MessageBox.Show("已更新到最新版");
  98. }
  99. else
  100. {
  101. errorMessage = "已是最新版,无需更新!";
  102. }
  103. }
  104. catch (Exception ex2)
  105. {
  106. errorCode = "-1";
  107. errorMessage = ex2.Message;
  108. }
  109. jObject.Add("errorCode", errorCode);
  110. jObject.Add("errorMessage", errorMessage);
  111. Log.LogInfo(jObject.ToString(), "doUpdate");
  112. logString = "结束调用更新程序:------------------------------------------------------------------------------------------";
  113. Log.LogInfo(logString, "doUpdate");
  114. return jObject.ToString();
  115. }
  116. public string DownLoad(string filePath, string fileName, string ftpPath, string ftpUserName, string ftpPassWord)
  117. {
  118. try
  119. {
  120. if (!Directory.Exists(filePath))
  121. {
  122. Directory.CreateDirectory(filePath);
  123. }
  124. FileStream outputStream = new FileStream(filePath + fileName, FileMode.Create);
  125. FtpWebRequest reqFTP = (FtpWebRequest)WebRequest.Create(new Uri(ftpPath + fileName));
  126. reqFTP.Method = "RETR";
  127. reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPassWord);
  128. reqFTP.UseBinary = true;
  129. FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
  130. Stream ftpStream = response.GetResponseStream();
  131. long cl = response.ContentLength;
  132. int bufferSize = 2048;
  133. byte[] buffer = new byte[bufferSize];
  134. for (int readCount = ftpStream.Read(buffer, 0, bufferSize); readCount > 0; readCount = ftpStream.Read(buffer, 0, bufferSize))
  135. {
  136. outputStream.Write(buffer, 0, readCount);
  137. }
  138. ftpStream.Close();
  139. outputStream.Close();
  140. response.Close();
  141. reqFTP = null;
  142. return "0";
  143. }
  144. catch (Exception ex)
  145. {
  146. return ex.Message;
  147. }
  148. }
  149. public string CheckUpdate(string inParams)
  150. {
  151. int checkFlag = 0;
  152. string code = "0";
  153. string message = "";
  154. //再从hip获取文件版本
  155. JObject jObject = new JObject();
  156. HttpServices restClient = new HttpServices();
  157. string hisResult = restClient.HISHTTPServices(inParams, hipIP, hipURL, hipAuthorization); //调用HIS回调
  158. JObject hisResultobj = JObject.Parse(hisResult);
  159. code = hisResultobj["errorCode"].ToString();
  160. message = hisResultobj["errorMessage"].ToString();
  161. if (code != "0") //
  162. {
  163. return "";
  164. }
  165. JArray array = new JArray();
  166. var resultObj = hisResultobj["result"];
  167. if (resultObj != null)
  168. {
  169. }
  170. else
  171. {
  172. return "";
  173. }
  174. //先获取本地文件版本
  175. if (System.IO.File.Exists(Path.GetFullPath(versionNumberFileName)))
  176. {
  177. IEnumerable<XElement> enumerable = XDocument.Load(versionNumberFileName).Root.Element("list").Elements();
  178. foreach (var result in resultObj)
  179. {
  180. string hipdllname = result["dllname"].ToString(); //文件名
  181. string hipaddress = result["toaddress"].ToString(); //文件地址
  182. hipaddress = hipaddress.Replace("\\", "/");
  183. string hipversionNumber = result["versionNumber"].ToString(); //版本号
  184. int flag = 1;
  185. //判断是否已更新
  186. foreach (XElement item in enumerable)
  187. {
  188. string itemKey = item.Attribute("key").Value;
  189. string itemValue = item.Attribute("value").Value;
  190. string versionNumber = item.Attribute("versionNumber").Value;
  191. string serverItemValue = itemValue;
  192. if ((hipdllname == itemKey) && (itemValue == hipaddress) && (versionNumber == hipversionNumber))
  193. {
  194. ///相同移除
  195. flag = 0;
  196. }
  197. }
  198. //没在已更新列表里
  199. if (flag == 1)
  200. {
  201. array.Add(result);
  202. }
  203. }
  204. }
  205. else
  206. {
  207. //没有更新列表就是全部更新
  208. foreach (var result in resultObj)
  209. {
  210. array.Add(result);
  211. }
  212. }
  213. return array.ToString();
  214. }
  215. private string getXMLValue(string path, string attr)
  216. {
  217. string xmlValue = "";
  218. XDocument document = XDocument.Load(path);
  219. XElement root = document.Root;
  220. XElement settingEle = root.Element("appSettings");
  221. IEnumerable<XElement> enumerable = settingEle.Elements();
  222. foreach (XElement item in enumerable)
  223. {
  224. if (item.Attribute("key").Value == attr)
  225. {
  226. xmlValue = item.Attribute("value").Value;
  227. }
  228. }
  229. return xmlValue;
  230. }
  231. public void SetUpdateList(string resultArr)
  232. {
  233. try
  234. {
  235. XmlDocument xmlDoc = new XmlDocument();
  236. var UpdateListObj = JArray.Parse(resultArr);
  237. if (System.IO.File.Exists(Path.GetFullPath(versionNumberFileName)))
  238. {
  239. xmlDoc.Load(versionNumberFileName);
  240. XmlNode file = xmlDoc.SelectSingleNode("file");
  241. XmlNodeList list = file.ChildNodes;
  242. foreach (XmlNode listobj in list)
  243. {
  244. foreach (var result in UpdateListObj)
  245. {
  246. string hipdllname = result["dllname"].ToString(); //文件名
  247. string hipaddress = result["toaddress"].ToString(); //文件地址
  248. hipaddress = hipaddress.Replace("\\", "/");
  249. string hipversionNumber = result["versionNumber"].ToString(); //版本号
  250. XmlElement add = xmlDoc.CreateElement("add");
  251. add.SetAttribute("key", hipdllname);
  252. add.SetAttribute("value", hipaddress);
  253. add.SetAttribute("versionNumber", hipversionNumber);
  254. listobj.AppendChild(add);
  255. }
  256. file.AppendChild(listobj);
  257. }
  258. xmlDoc.Save(versionNumberFileName);
  259. }
  260. else
  261. {
  262. //没有更新列表就是全部更新
  263. XmlElement xml = xmlDoc.CreateElement("", "file", "");
  264. xmlDoc.AppendChild(xml);
  265. XmlNode file = xmlDoc.SelectSingleNode("file");
  266. XmlElement list = xmlDoc.CreateElement("list");
  267. foreach (var result in UpdateListObj)
  268. {
  269. string hipdllname = result["dllname"].ToString(); //文件名
  270. string hipaddress = result["toaddress"].ToString(); //文件地址
  271. hipaddress = hipaddress.Replace("\\", "/");
  272. string hipversionNumber = result["versionNumber"].ToString(); //版本号
  273. XmlElement add = xmlDoc.CreateElement("add");
  274. add.SetAttribute("key", hipdllname);
  275. add.SetAttribute("value", hipaddress);
  276. add.SetAttribute("versionNumber", hipversionNumber);
  277. list.AppendChild(add);
  278. }
  279. file.AppendChild(list);
  280. xmlDoc.Save(versionNumberFileName);
  281. }
  282. }
  283. catch (Exception ex)
  284. {
  285. //MessageBox.Show("生成失败:" + ex.Message);
  286. }
  287. }
  288. public void ExecuteAsAdmin(string fileName)
  289. {
  290. Process proc = new Process();
  291. proc.StartInfo.FileName = fileName;
  292. proc.StartInfo.UseShellExecute = true;
  293. proc.StartInfo.Verb = "runas";
  294. proc.Start();
  295. }
  296. public string CheckLinkFtp(string ftpip, string serverFTPName, string serverFTPPassword, string port)
  297. {
  298. //System.Diagnostics.Debugger.Launch();
  299. string errorCode = "0";
  300. string errorMessage = "";
  301. bool checkflag = CheckFtp(ftpip, serverFTPName, serverFTPPassword, out errorMessage, Convert.ToInt32(port));
  302. if (!checkflag)
  303. {
  304. errorCode = "-1";
  305. }
  306. JObject returnobj = new JObject();
  307. returnobj.Add("errorCode", errorCode);
  308. returnobj.Add("errorMessage", errorMessage);
  309. return returnobj.ToString();
  310. }
  311. /// <summary>
  312. /// 通过socket判断ftp是否通畅
  313. /// </summary>
  314. /// <returns></returns>
  315. public static bool CheckFtp(string ip, string ftpuser, string ftppas, out string errmsg, int port = 21)
  316. {
  317. #region 输入数据检查
  318. if (ftpuser.Trim().Length == 0)
  319. {
  320. errmsg = "FTP用户名不能为空,请检查设置!";
  321. return false;
  322. }
  323. if (ftppas.Trim().Length == 0)
  324. {
  325. errmsg = "FTP密码不能为空,请检查设置!";
  326. return false;
  327. }
  328. IPAddress address;
  329. try
  330. {
  331. address = IPAddress.Parse(ip);
  332. }
  333. catch
  334. {
  335. errmsg = string.Format("FTP服务器IP:{0}解析失败,请检查是否设置正确!", ip);
  336. return false;
  337. }
  338. #endregion
  339. bool ret = false;
  340. byte[] result = new byte[1024];
  341. int pingStatus = 0, userStatus = 0, pasStatus = 0, exitStatus = 0; //连接返回,用户名返回,密码返回,退出返回
  342. try
  343. {
  344. int receiveLength;
  345. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  346. socket.SendTimeout = 2000;
  347. socket.ReceiveTimeout = 2000;//超时设置成2000毫秒
  348. try
  349. {
  350. socket.Connect(new IPEndPoint(address, port)); //以21端口进行连接
  351. pingStatus = 200;
  352. }
  353. catch
  354. {
  355. pingStatus = -1;
  356. }
  357. if (pingStatus == 200) //状态码200 - TCP连接成功
  358. {
  359. receiveLength = socket.Receive(result);
  360. pingStatus = getFtpReturnCode(result, receiveLength); //连接状态
  361. if (pingStatus == 220)//状态码220 - FTP返回欢迎语
  362. {
  363. socket.Send(Encoding.Default.GetBytes(string.Format("{0}{1}", "USER " + ftpuser, Environment.NewLine)));
  364. receiveLength = socket.Receive(result);
  365. userStatus = getFtpReturnCode(result, receiveLength);
  366. if (userStatus == 331)//状态码331 - 要求输入密码
  367. {
  368. socket.Send(Encoding.Default.GetBytes(string.Format("{0}{1}", "PASS " + ftppas, Environment.NewLine)));
  369. receiveLength = socket.Receive(result);
  370. pasStatus = getFtpReturnCode(result, receiveLength);
  371. if (pasStatus == 230)//状态码230 - 登入因特网
  372. {
  373. errmsg = string.Format("FTP:{0}@{1}登陆成功", ip, port);
  374. ret = true;
  375. socket.Send(Encoding.Default.GetBytes(string.Format("{0}{1}", "QUIT", Environment.NewLine))); //登出FTP
  376. receiveLength = socket.Receive(result);
  377. exitStatus = getFtpReturnCode(result, receiveLength);
  378. }
  379. else
  380. { // 状态码230的错误
  381. errmsg = string.Format("FTP:{0}@{1}登陆失败,用户名或密码错误({2})", ip, port, pasStatus);
  382. }
  383. }
  384. else
  385. {// 状态码331的错误
  386. errmsg = string.Format("使用用户名:‘{0}‘登陆FTP:{1}@{2}时发生错误({3}),请检查FTP是否正常配置!", ftpuser, ip, port, userStatus);
  387. }
  388. }
  389. else
  390. {// 状态码220的错误
  391. errmsg = string.Format("FTP:{0}@{1}返回状态错误({2}),请检查FTP服务是否正常运行!", ip, port, pingStatus);
  392. }
  393. }
  394. else
  395. {// 状态码200的错误
  396. errmsg = string.Format("无法连接FTP服务器:{0}@{1},请检查FTP服务是否启动!", ip, port);
  397. }
  398. socket.Close(); //关闭socket
  399. socket = null;
  400. }
  401. catch (Exception ex)
  402. { //连接出错
  403. errmsg = string.Format("FTP:{0}@{1}连接出错:", ip, port) + ex.Message;
  404. ret = false;
  405. }
  406. return ret;
  407. }
  408. /// <summary>
  409. /// 传递FTP返回的byte数组和长度,返回状态码(int)
  410. /// </summary>
  411. /// <param name="retByte"></param>
  412. /// <param name="retLen"></param>
  413. /// <returns></returns>
  414. private static int getFtpReturnCode(byte[] retByte, int retLen)
  415. {
  416. try
  417. {
  418. string str = Encoding.ASCII.GetString(retByte, 0, retLen).Trim();
  419. return int.Parse(str.Substring(0, 3));
  420. }
  421. catch
  422. {
  423. return -1;
  424. }
  425. }
  426. }
  427. }