using Core.Mes.Client.Comm.Format;
using Core.StlMes.Client.LgResMgt.Mcms.entity;
using CoreFS.CA06;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
namespace Core.StlMes.Client.LgResMgt.Mcms
{
///
/// 在进入系统后,需开启这个线程用于每10秒上传一次图片到ftp服务器
/// 在退出系统后,需关闭这个线程
///
public class ImageControl
{
SFTPHelper ftp_helper;
VSFTPHelper vftp_helper;
Thread task;
string FtpIp { get; set; }
int FtpPort { get; set; }
string Username { get; set; }
string FtpPwd { get; set; }
string Ftptype { get; set; }
string FtpPath { get; set; }
public OpeBase OB { get; set; }
public ImageControl(string ftpIp ,string ftpPort,string username,string ftpPwd ,string ftptype,string path , OpeBase ob)
{
FtpPort = Convert.ToInt32(ftpPort);
FtpIp = ftpIp;
Username = username;
FtpPwd = ftpPwd;
Ftptype = ftptype;
FtpPath = path;
OB = ob;
switch (ftptype)//区别在哪。先确认一下
{
case "0":
ftp_helper = new SFTPHelper(ftpIp, FtpPort, username, ftpPwd);
break;
case "1":
vftp_helper = new VSFTPHelper( ftpIp, username, ftpPwd, path);
break;
}
}
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;
//删除正式目录文件
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(Ftptype))
{
if (files == null || files.Count == 0 || ftp_helper == null) return;
}
else
{
if (files == null || files.Count == 0 || vftp_helper == null) return;
}
if (Ftptype == "0")
{
if (!ftp_helper.Connect()) return;
}
string localpath = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, @"imgShort\formalImg\"));
string lastpath = 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(FtpPath, u3.ToString().Replace("../", ""));
//验证文件名是否合法
string filename = Path.GetFileName(_filepath);
//filename : 计量作业编号_序号.jpg 计量作业编号:计量点编号+年月日时分秒
CmmWorkImageEntity ci = ParseFileName(filename, ftpdir.Replace("formalImg", DateTime.Now.ToString("yyyy-MM-dd")));
if (ci == null) continue;
switch (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;
var ccp = new CoreClientParam
{
ServerName = "com.steering.Mcms.CmmWorkImageServer",
MethodName = "addInfo",
ServerParams = new object[]
{
JSONFormat.Format(ci)
}
};
ccp = OB.ExecuteNonQuery(ccp, CoreInvokeType.Internal);
if (ccp.ReturnCode != -1)
{
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 CmmWorkImageEntity ParseFileName(string filename, string ftpdir)
{
CmmWorkImageEntity ci = new CmmWorkImageEntity();
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", ""),null);
}
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)
{
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 { }
}
//*/
}
}