using Common; using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Drawing; using com.hnshituo.core.webapp.vo; namespace MeterPlugInLibrary { /// /// 在进入系统后,需开启这个线程用于每10秒上传一次图片到ftp服务器 /// 在退出系统后,需关闭这个线程 /// public class ImageControl { SFTPHelper ftp_helper; VSFTPHelper vftp_helper; Thread task; public ImageControl() { Init(); } private void Init() { switch (AppConfigCache.ftpType) { case "0": ftp_helper = new SFTPHelper(AppConfigCache.ftpIp, AppConfigCache.ftpPort, AppConfigCache.ftpUid, AppConfigCache.ftpPwd); break; case "1": //vftp_helper = new VSFTPHelper(); vftp_helper = new VSFTPHelper(AppConfigCache.ftpIp, AppConfigCache.ftpUid, AppConfigCache.ftpPwd); break; } } /// /// 启动TFP上传线程 /// public void Start() { if (task == null) { task = new Thread(new ThreadStart(Doworks)); task.Start(); } } public void Stop() { if (task != null) { task.Abort(); task = null; } } private void Doworks() { do { int waitSecs = 10000; int i = 0; try { string sPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "imgShort\\"; i = 1; string picPath = Path.Combine(sPath, "tempImg"); i = 2; ArrayList UnZipedFiles = GetFiles(picPath, ".jpg");//tmp! i = 3; //ZipFiles(UnZipedFiles); //2021年3月2日不再进行图片压缩,直接存到正式文件夹formalImg中 i = 4; //获取正式目录文件进行上传 ArrayList files = GetFiles(sPath + "formalImg", ".jpg"); i = 5; UploadFiles(files); i = 6; //删除正式目录文件 if (Directory.Exists(sPath))//如果不存在就不用删 { //RemoveRedundantDir(Path.Combine(sPath, "formalImg"), 0); } i = 7; } catch (Exception exp) { WriteLog("ImageControl.Doworks在" + i + "位置异常,异常信息:" + exp.Message); } finally { Thread.Sleep(waitSecs); } } while (true); } private void RemoveRedundantDir(string _path, int deep) { DirectoryInfo theFolder = new DirectoryInfo(_path); DirectoryInfo[] dirInfos = theFolder.GetDirectories(); if (dirInfos != null && dirInfos.Count() > 0) { foreach (DirectoryInfo di in dirInfos) { RemoveRedundantDir(di.FullName, deep + 1); } } try { if (deep == 0) return; FileInfo[] fileinfos = theFolder.GetFiles(); if (fileinfos == null || fileinfos.Count() == 0) { DateTime dt; if (DateTime.TryParseExact(theFolder.Name, "yyyy-MM-dd", CultureInfo.CurrentCulture, DateTimeStyles.AllowWhiteSpaces, out dt)) { if (TimeSpan.FromTicks(DateTime.Today.Ticks).Subtract(TimeSpan.FromTicks(dt.Date.Ticks)).TotalDays > 1) { Directory.Delete(_path); } } } } catch { } } private void ZipFiles(ArrayList UnzipedFiles) { ImageZip iz = new ImageZip(); if (UnzipedFiles == null || UnzipedFiles.Count == 0) return; foreach (string fn in UnzipedFiles) { if (string.IsNullOrEmpty(fn)) continue; if (!File.Exists(fn)) continue; //临时目录图片压缩后存储与正式目录 string jpgFile = fn.Replace("tempImg", "formalImg"); Image img = ImageZip.BytesToBitmap(ImageZip.ZipImageByte(fn)); if (img != null) { //iz.ResourceImage = img; //压缩图片并保存 //iz.GetReducedImage(AppConfigCache.imgWidth, AppConfigCache.imgHeight).Save(jpgFile); img.Save(jpgFile); File.Delete(fn);//删除临时目录数据 } else { iz.ResourceImage = img; //压缩图片并保存 iz.GetReducedImage(400, 400).Save(jpgFile); //File.Move(fn, jpgFile); } } } private ArrayList GetFiles(string _dirPath, string extensionName) { ArrayList files = new ArrayList(); if (!Directory.Exists(_dirPath)) return null; DirectoryInfo theFolder = new DirectoryInfo(_dirPath); FileInfo[] fileinfos = theFolder.GetFiles("*" + extensionName); if (fileinfos != null && fileinfos.Count() > 0) { foreach (FileInfo fi in fileinfos) { files.Add(fi.FullName); } } DirectoryInfo[] dirInfos = theFolder.GetDirectories(); if (dirInfos != null && dirInfos.Count() > 0) { foreach (DirectoryInfo di in dirInfos) { files.AddRange(GetFiles(di.FullName, extensionName)); } } return files; } // 后台刷FTP线程调用 private void UploadFiles(ArrayList files) { if ("0".Equals(AppConfigCache.ftpType)) { if (files == null || files.Count == 0 || ftp_helper == null) return; } else { if (files == null || files.Count == 0 || vftp_helper == null) return; } if (AppConfigCache.ftpType == "0") { if (!ftp_helper.Connect()) return; } string localpath = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, @"imgShort\formalImg\")); string lastpath = AppConfigCache.ftpPath; foreach (string _filepath in files) { try { //计算ftp相对路径 Uri u1 = new Uri(localpath, UriKind.Absolute); Uri u2 = new Uri(Path.GetDirectoryName(_filepath), UriKind.Absolute); Uri u3 = u1.MakeRelativeUri(u2);//u2相对于u1的uri //string ftpdir = Path.Combine(AppConfigCache.ftpPath + "/", u3.ToString()); string ftpdir = Path.Combine(AppConfigCache.ftpPath, u3.ToString().Replace("../", "")); //验证文件名是否合法 string filename = Path.GetFileName(_filepath); //filename : 计量作业编号_序号.jpg 计量作业编号:计量点编号+年月日时分秒 MeterWorkImage ci = ParseFileName(filename, ftpdir.Replace("formalImg", DateTime.Now.ToString("yyyy-MM-dd"))); if (ci == null) continue; switch (AppConfigCache.ftpType) { case "0": { if (ftpdir != lastpath) { ftp_helper.CreateDirectory(ftpdir); } ftp_helper.Put(_filepath, ftpdir, filename); }; break; case "1": { vftp_helper.FtpUp(_filepath); }; break; } lastpath = ftpdir; //存储计量数据的时候,实际上是先将计量数据及图片路径 MeterWorkImageService service = new MeterWorkImageService(); RESTfulResult rm = service.doSaveWf(ci); //db.doOption("MeterWorkImageService", "doSaveWf", new object[] { ci }, 1); if (rm.Succeed) { WriteLog(string.Format("更新图片记录[{0}]:{1}", ci.actualFirstNo, filename)); File.Delete(_filepath); } else { WriteLog(string.Format("上传图片失败! [{0}]\n{1}", ci.actualFirstNo, filename)); } // } catch (Exception exp) { WriteLog(string.Format("上传图片失败! [{0}]\n{1}", _filepath, exp.Message)); } } if (vftp_helper == null) { ftp_helper.Disconnect(); } } /// /// 验证图片名称 /// /// 计量点编号_作业编号_序号.jpg /// /// private MeterWorkImage ParseFileName(string filename, string ftpdir) { MeterWorkImage ci = new MeterWorkImage(); filename = Path.GetFileName(filename); string[] segs = filename.Split(new char[] { '_' }, StringSplitOptions.RemoveEmptyEntries); if (segs == null || segs.Count() < 3) { WriteLog("文件名不符合要求! (3段命名):" + filename); return null; } int seq; //int icar_seq = 0; //int.TryParse(car_seq, out icar_seq); string[] seqs = segs[2].Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); if (seqs == null || seqs.Count() == 0 || !int.TryParse(seqs[0], out seq)) { WriteLog("文件名不符合要求! (序号不正确):" + filename); return null; } string fullfilename = ftpdir + "/" + filename; fullfilename = fullfilename.Replace("//", "/").Replace("//", "/"); PropertyInfo pi = null; try { pi = ci.GetType().GetProperty(string.Format("imageFile{0}", seq)); pi.SetValue(ci, fullfilename.Replace("/pub", "")); } catch { WriteLog("文件名不符合要求! (序号超出数据库要求):" + fullfilename); return null; } //ci.image_time = DateTime.ParseExact(segs[0].Substring(segs[0].Length - 14, 14), "yyyyMMddHHmmss", CultureInfo.CurrentCulture); ci.actualFirstNo = segs[1]; return ci; } public void Release() { try { if (ftp_helper != null) { ftp_helper.Disconnect(); } if (task != null) { task.Abort(); task = null; } } catch { } } private static void WriteLog(string str) { // 20220925 By BourneCao 暂时屏蔽语音播放日志 return; try { string m_szRunPath; m_szRunPath = System.Environment.CurrentDirectory; if (System.IO.Directory.Exists(m_szRunPath + "\\log") == false) { System.IO.Directory.CreateDirectory(m_szRunPath + "\\log"); } string strDate = System.DateTime.Now.ToString("yyyyMMdd"); string strPathFile = m_szRunPath + "\\log\\" + strDate; if (!Directory.Exists(strPathFile))//如果不存在就创建file文件夹 { Directory.CreateDirectory(strPathFile); } System.IO.TextWriter tw = new System.IO.StreamWriter(strPathFile + "\\FTP_image_" + strDate + ".log", true); tw.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); tw.WriteLine(str); tw.WriteLine("\r\n"); tw.Close(); } catch { } } //*/ } }