Quellcode durchsuchen

提交WINFORM代码

BourneCao vor 4 Jahren
Ursprung
Commit
ce8e84b8be

+ 4 - 4
CarMeterSystem/Form1.cs

@@ -33,8 +33,8 @@ namespace CarMeterSystem
         //实时表数据采集
         private DataCollectionControl collection = new DataCollectionControl();
 
-        //图片控制器含图片压缩及上传sftp
-        private ImageControl imageControl = new ImageControl();
+        //图片控制器含图片压缩及上传curl
+        private ImageCurlControl imageCurlControl = new ImageCurlControl();
 
         //与监控界面对接的表
         private MeterWorkMonitorService meterWorkMonitor = new MeterWorkMonitorService();
@@ -171,7 +171,7 @@ namespace CarMeterSystem
                         collection.EventDataCollectionArgs += new EventDataCollection(EventData);//数据采集
                         collection.Start(PbCache.sportInfo.baseSpotNo, PbCache.sportInfo.baseSpotName);
 
-                        imageControl.Start(); //图片采集线程
+                        imageCurlControl.Start(); //图片采集线程
                         ////***********************暂时注释掉*****************************************************
                         ////sweepCodeClass.StartThreadSweep();
                         ////**************************************************************************************
@@ -1231,7 +1231,7 @@ namespace CarMeterSystem
         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
         {
             collection.Stop();
-            imageControl.Stop();
+            imageCurlControl.Stop();
             sweepCodeClass.CloseThread();
             timer1.Stop();
             timer1.Dispose();

+ 4 - 4
CarMeterSystem/frmMain.cs

@@ -28,8 +28,8 @@ namespace CarMeterSystem
         //实时表数据采集
         private DataCollectionControl collection = new DataCollectionControl();
 
-        //图片控制器含图片压缩及上传sftp
-        private ImageControl imageControl = new ImageControl();
+        //图片控制器含图片压缩及上传curl
+        private ImageCurlControl imageCurlControl = new ImageCurlControl();
 
         //与监控界面对接的表
         private MeterWorkMonitorService meterWorkMonitor = new MeterWorkMonitorService();
@@ -163,7 +163,7 @@ namespace CarMeterSystem
                         collection.EventDataCollectionArgs += new EventDataCollection(EventData);//数据采集及扫码信息
                         collection.Start(PbCache.sportInfo.baseSpotNo, PbCache.sportInfo.baseSpotName);
 
-                        imageControl.Start(); //图片上传线程
+                        imageCurlControl.Start(); //图片上传线程
                         sweepCodeClass.StartThreadSweep(); //扫码线程
                     }
                     else
@@ -860,7 +860,7 @@ namespace CarMeterSystem
         private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
         {
             collection.Stop();
-            imageControl.Stop();
+            imageCurlControl.Stop();
             sweepCodeClass.CloseThread();
             timer1.Stop();
             timer1.Dispose();

+ 3 - 3
CarRemoteMeter/Form1.cs

@@ -27,7 +27,7 @@ namespace CarRemoteMeter
         }
 
         //图片控制器含图片压缩及上传sftp
-        ImageControl imageControl = new ImageControl();
+        ImageCurlControl imageCurlControl = new ImageCurlControl();
 
         /// <summary>
         /// 基础数据载入
@@ -111,7 +111,7 @@ namespace CarRemoteMeter
                 lbPointName.Text = "";
                 lbMeterMan.Text = userName;
                 PbCache.isNotValid = true;
-                imageControl.Start();
+                imageCurlControl.Start();
             }
         }
 
@@ -1839,7 +1839,7 @@ namespace CarRemoteMeter
 
             try
             {
-                imageControl.Stop();
+                imageCurlControl.Stop();
             }
             catch { }
         }

+ 1 - 0
MeterPlugInLibrary/MeterPlugInLibrary.csproj

@@ -58,6 +58,7 @@
   <ItemGroup>
     <Compile Include="LED\LedDll.cs" />
     <Compile Include="LED\LED_Control.cs" />
+    <Compile Include="图片处理\ImageCurlControl.cs" />
     <Compile Include="实时库数据采集\BeltScaleDataCollectionControl.cs" />
     <Compile Include="实时库数据采集\CraneScaleControl.cs" />
     <Compile Include="实时库数据采集\HotDeliveryDataCollectionControl.cs" />

+ 371 - 0
MeterPlugInLibrary/图片处理/ImageCurlControl.cs

@@ -0,0 +1,371 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Security;
+using System.Reflection;
+using System.Security.Cryptography.X509Certificates;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using com.hnshituo.core.webapp.vo;
+using Common;
+using CoreFS.CA06;
+
+namespace MeterPlugInLibrary
+{
+    public class ImageCurlControl
+    {
+        Thread task;
+
+        public ImageCurlControl()
+        {
+            Init();
+        }
+
+        private void Init()
+        {
+        }
+
+        /// <summary>
+        /// 启动TFP上传线程
+        /// </summary>
+        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 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)
+        {
+            string localpath = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, @"imgShort\formalImg\"));
+            string lastpath = AppConfigCache.ftpPath;
+            foreach (string _filepath in files)
+            {
+                try
+                {
+                    string ftpdir = Path.Combine(AppConfigCache.ftpPath, DateTime.Now.ToString("yyyy-MM-dd"));
+
+                    //验证文件名是否合法
+                    string filename = Path.GetFileName(_filepath);
+                    //filename :  计量作业编号_序号.jpg   计量作业编号:计量点编号+年月日时分秒
+                    MeterWorkImage ci = ParseFileName(filename, ftpdir);
+
+                    if (ci == null) continue;
+
+                    // 上传文件
+                    UploadRequest(ftpdir, localpath + filename);
+
+
+                     //存储计量数据的时候,实际上是先将计量数据及图片路径
+                     MeterWorkImageService service = new MeterWorkImageService();
+                    RESTfulResult<string> rm = service.doSaveWf(ci); //db.doOption<string>("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));
+                }
+            }
+        }
+
+        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 { }
+        }
+
+        /// <summary>
+        /// 验证图片名称
+        /// </summary>
+        /// <param name="filename">计量点编号_作业编号_序号.jpg</param>
+        /// <param name="ftpdir"></param>
+        /// <returns></returns>
+        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;
+        }
+
+        private static void WriteLog(string str)
+        {
+            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 { }
+        }
+        private void UploadRequest(string url, string filePath)
+        {
+            // 时间戳,用做boundary
+            string timeStamp = DateTime.Now.Ticks.ToString("x");
+
+            //根据uri创建HttpWebRequest对象
+            HttpWebRequest oWebrequest = (HttpWebRequest)WebRequest.Create(new Uri(url));
+
+            //如果是发送HTTPS请求  
+            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
+            {
+                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
+                ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
+                                       | SecurityProtocolType.Tls
+                                       | (SecurityProtocolType)0x300 //Tls11
+                                       | (SecurityProtocolType)0xC00; //Tls12
+
+                oWebrequest = WebRequest.Create(url) as HttpWebRequest;
+                oWebrequest.ProtocolVersion = HttpVersion.Version11;
+            }
+            else
+            {
+                oWebrequest = WebRequest.Create(url) as HttpWebRequest;
+            }
+
+            //HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(url));
+            oWebrequest.Method = "POST";
+            oWebrequest.AllowWriteStreamBuffering = false; //对发送的数据不使用缓存
+            oWebrequest.Timeout = 300000;  //设置获得响应的超时时间(300秒)
+            oWebrequest.ContentType = "multipart/form-data; boundary=" + timeStamp;
+
+            //文件
+            FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
+            BinaryReader binaryReader = new BinaryReader(fileStream);
+
+            //头信息
+            string boundary = "--" + timeStamp;
+            string dataFormat = boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\nContent-Type:application/octet-stream\r\n\r\n";
+            string header = string.Format(dataFormat, "file", Path.GetFileName(filePath));
+            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(header);
+
+            //结束边界
+            byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + timeStamp + "--\r\n");
+
+            long length = fileStream.Length + postHeaderBytes.Length + boundaryBytes.Length;
+
+            oWebrequest.ContentLength = length;//请求内容长度
+
+            try
+            {
+                //每次上传4k
+                int bufferLength = 4096;
+                byte[] buffer = new byte[bufferLength];
+
+                //已上传的字节数
+                long offset = 0;
+                int size = binaryReader.Read(buffer, 0, bufferLength);
+                Stream postStream = oWebrequest.GetRequestStream();
+
+                //发送请求头部消息
+                postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
+
+                while (size > 0)
+                {
+                    postStream.Write(buffer, 0, size);
+                    offset += size;
+                    size = binaryReader.Read(buffer, 0, bufferLength);
+                }
+
+                //添加尾部边界
+                postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
+                postStream.Close();
+
+                //获取服务器端的响应
+                using (HttpWebResponse response = (HttpWebResponse)oWebrequest.GetResponse())
+                {
+                    Stream receiveStream = response.GetResponseStream();
+                    StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
+                    string returnValue = readStream.ReadToEnd();
+                    response.Close();
+                    readStream.Close();
+                }
+            }
+            catch (Exception ex)
+            {
+                //Debug.WriteLine("文件传输异常: " + ex.Message);
+            }
+            finally
+            {
+                fileStream.Close();
+                binaryReader.Close();
+            }
+        }
+
+        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
+        {
+            return true; //总是接受  
+        }
+    }
+}