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 { }
}
//*/
}
}