using Aliyun.OSS; using Aliyun.OSS.Common; using BizCom; using ICSharpCode.SharpZipLib.Zip; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Runtime.InteropServices; using System.Security.Principal; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web; public partial class supplierBuildFile : System.Web.UI.Page { public static string upPath = ConfigurationManager.AppSettings["upPath"]; public static string copyPath = ConfigurationManager.AppSettings["copyPath"]; public static string siteUrl = ConfigurationManager.AppSettings["OriSiteUrl"]; [DllImport("DrvInterface64.dll", CharSet = CharSet.Unicode)] public static extern uint DecFile(string filename); [DllImport("DrvInterface64.dll", CharSet = CharSet.Unicode)] public static extern int IsFileEncrypted(string filename);//返回1为加密,0为未被加密 [DllImport("DrvInterface64.dll", CharSet = CharSet.Ansi)] public static extern void CreateUserKey(StringBuilder key, int len); [DllImport("DrvInterface64.dll", CharSet = CharSet.Ansi)] public static extern int InitAesKey(StringBuilder key, int len); [DllImport("DrvInterface64.dll")] public static extern int IsInitedAesKey(); private void conErc(string msg) { XLog.SaveLog(0, msg); Response.Write(msg); //Response.StatusCode = (int)HttpStatusCode.NotFound; //Response.End(); } private void conSuc(string msg) { Response.Write("{\"type\":\"success\",\"result\":\"" + msg + "\"}"); //Response.End(); } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Response.Buffer = true; downloadMore(); } } private string getCanDownFile(string fileName) { string[] extArr = new string[] { ".cdr", ".zip", ".rar", ".pdf" }; foreach (string ext in extArr) { string fname = fileName + ext; if (File.Exists(fname)) { return ext; } } return ""; } static bool running = false; private void downloadMore() { if (running) { conSuc("运行中!"); return; } running = true; var identity = WindowsIdentity.GetCurrent(); var principal = new WindowsPrincipal(identity); Task.Run(async () => { using (identity.Impersonate()) { StringBuilder sql = new StringBuilder(); sql.AppendFormat("select * from CE_ErpPackData WITH(nolock) where upStatus = 0"); int userId = 1; DataTable dt = CeErpTradeCell.ExecuteDataset(sql.ToString()).Tables[0]; string updateSql = ""; if (dt != null && dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { string zipFileName = dr["fileName"].ToString(); int supplierId = 0; string packId = dr["ID"].ToString(); try { CeErpTradeLog.ExecuteNonQuery(string.Format("update CE_ErpPackData set upStatus = 1 where ID= {0} ;", packId)); DataTable itemData = CeErpTradeCell.ExecuteDataset(string.Format("select ctid,seller_memo,FinishDesignTime,OrderState,SupplierName,OrderSn,tid,SupplierId from view_erptradecell where FinishDesignTime is not null and ctid in (SELECT ctid FROM CE_ErpPackDataItem WHERE packId = {0})", packId)).Tables[0]; List files = new List(); List tids = new List(); int upStatus = 3; string url = ""; if (itemData != null && itemData.Rows.Count > 0) { string suppierName = ""; foreach (DataRow row in itemData.Rows) { supplierId = Convert.ToInt32(row["SupplierId"].ToString()); string finishDesignTime = getDesignTime(row["FinishDesignTime"]); string ctid = row["ctid"].ToString(); string df_name = upPath + "\\" + finishDesignTime + "\\" + formatMemo(row["seller_memo"]); string ext = getCanDownFile(df_name); suppierName = row["SupplierName"].ToString(); if (string.IsNullOrEmpty(ext)) { //不存在则打包失败 updateSql += string.Format("update CE_ErpPackDataItem set message = '文件不存在!' where packId= {0} and ctid='{1}' ;", packId, ctid); files = new List(); supplierId = 0; break; } string fname = df_name + ext; if (Convert.ToInt16(row["OrderState"]) != 6) { updateSql += string.Format("update CE_ErpPackDataItem set message = '订单状态不正确!' where packId= {0} and ctid='{1}' ;", packId, ctid); continue; } int IsFileEncrypt = IsFileEncrypted(fname); if (IsFileEncrypt == 1 && File.Exists(fname)) { string key = "gBQnlxiBb7MthH9644V0W0pFwqYZgyy7"; var sb = new StringBuilder(key); //Linux系统的接口要调用一次,Windows系统要调用两次 CreateUserKey(sb, key.Length); CreateUserKey(sb, key.Length); //破解用dse生成的文件,需要调2次。 int result = InitAesKey(sb, sb.Length); result = IsInitedAesKey(); if (result != 1) { addLog(ctid, userId, "初始化秘钥失败" + result, 0); updateSql += string.Format("update CE_ErpPackDataItem set message = '解密失败!' where packId= {0} and ctid='{1}' ;", packId, ctid); continue; } uint a = DecFile(fname); if (a != 0) { addLog(ctid, userId, "解密失败" + a, 0); updateSql += string.Format("update CE_ErpPackDataItem set message = '解密失败!' where packId= {0} and ctid='{1}' ;", packId, ctid); continue; } } if (string.IsNullOrEmpty(fname)) { updateSql += string.Format("update CE_ErpPackDataItem set message = '解密失败!' where packId= {0} and ctid='{1}' ;", packId, ctid); continue; } try { copyFile(getDesignDate(row["FinishDesignTime"]), suppierName, fname, zipFileName.Replace(".zip", "")); files.Add(fname); supplierId = 0; tids.Add("'" + ctid + "'"); } catch (Exception ex) { writeLog("打包复制文件出错!" + ex.Message); updateSql += string.Format("update CE_ErpPackDataItem set message = '复制文件出错!{2}' where packId= {0} and ctid='{1}' ;", packId, ctid, ex.Message); files = new List();//清空数据 supplierId = 0; break; } } if (files.Count == 0) { updateSql += string.Format("update CE_ErpPackData set upStatus = 3,message='没有可打包文件!' where ID= {0} ;", packId); continue; } else { string sourceFolder = getCopyPath(getDesignDate(""), suppierName, zipFileName.Replace(".zip", "")); string zipFilePath = getCopyPath(getDesignDate(""), suppierName) + "\\" + zipFileName; ZipLargeFolder(sourceFolder, zipFilePath, supplierId); url = FileOssUpV2(zipFilePath, zipFileName); if (url != null) { upStatus = 2; updateSql += string.Format("insert into CE_ErpTradeLog(tid,orderstate,userid,operatetime,con) select ctid,{1},{2},getdate(),'{3}' from ce_erptradecell where ctid in ({0}) ;", string.Join(",", tids), (int)OrderState.下单完成, 0, "下载设计文件"); updateSql += string.Format("update ce_erptradecell set UpdateTime=getdate() where ctid in ({0}) ;", string.Join(",", tids)); } } } updateSql += string.Format("update CE_ErpPackData set upStatus = {1},fileUrl='{2}' where ID= {0} ;", packId, upStatus, url); } catch (Exception ex) { writeLog("打包文件出错!" + ex.Message); updateSql += string.Format("update CE_ErpPackData set upStatus = 3 where ID= {0} ;", packId); } CeErpTradeLog.ExecuteNonQuery(updateSql); updateSql = ""; } } running = false; } }); conSuc("运行结束!"); //FileOssUp(); } private static string dealMemoName(string name) { string[] al = name.Split('-'); List list = new List(); string pa = string.Empty; for (int i = 0; i < al.Length; i++) { if (i == 1) { if (al[i].Contains("(") || al[i].Contains("(")) { string tname = al[i].Replace(")", "").Replace(")", "").Replace("(", "").Replace("(", ""); if (!string.IsNullOrEmpty(tname)) { pa = al[i]; } continue; } } list.Add(al[i]); } if (!string.IsNullOrEmpty(pa)) { list.Insert(3, pa); } name = string.Join("-", list); return name; } private string formatMemo(object memo) { string m = memo.ToString(); m = m.Replace("\\", "").Replace("/", "").Replace(":", "").Replace("*", "").Replace("?", "").Replace("<", "").Replace(">", "").Replace("|", ""); return m; } private void copyFile(string date, string supplier, string file, string zipName = "") { string path = getCopyPath(date, supplier, zipName); if (!Directory.Exists(path)) Directory.CreateDirectory(path); string fname = Path.GetFileName(file); File.Copy(file, path + "\\" + fname, true); if (!File.Exists(path + "\\" + fname)) { File.Copy(file, path + "\\" + fname, true); } } private string getCopyPath(string date, string supplier, string zipName = "") { string path = copyPath + "\\" + date + "\\" + supplier + "\\" + "车间下载"; if (!string.IsNullOrEmpty(zipName)) { path = path + "\\" + zipName; } return path; } private string getDesignTime(object v) { if (v.ToString() == "") return ""; return Convert.ToDateTime(v).ToString("yyyyMMdd"); } private string getDesignDate(object v) { int year = DateTime.Now.Year; int month = DateTime.Now.Month; int day = DateTime.Now.Day; return year + "\\" + month + "\\" + day; /*if (v.ToString() == "") return ""; return Convert.ToDateTime(v).ToString("yyyy-MM-dd");*/ } private string FileOssUp(byte[] buffer, string fileName) { // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 var endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 var accessKeyId = "LTAI5tE7wuNkeT9jZ42bQnyr"; var accessKeySecret = "NnutvWhKl4HbQFSad3HosYbCkEkbjN"; // 填写Bucket名称,例如examplebucket。 var bucketName = "ltcloudfile"; int year = DateTime.Now.Year; int month = DateTime.Now.Month; int day = DateTime.Now.Day; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 var objectName = "supplierFile/" + year + "/" + month + "/" + day + "/" + fileName; // 填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。 string region = "cn-hangzhou"; // 创建ClientConfiguration实例,按照您的需要修改默认参数。 var conf = new ClientConfiguration(); // 设置v4签名。 conf.SignatureVersion = SignatureVersion.V4; // 创建OssClient实例。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); try { MemoryStream requestContent = new MemoryStream(buffer); // 上传文件。 client.PutObject(bucketName, objectName, requestContent); } catch (Exception ex) { writeLog("打包文件上传oss出错!" + ex.Message); return null; } return "https://ltcloudfile.oss-cn-hangzhou.aliyuncs.com/" + objectName; } private string FileOssUpV2(string filePath, string fileName) { // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 var endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 var accessKeyId = "LTAI5tE7wuNkeT9jZ42bQnyr"; var accessKeySecret = "NnutvWhKl4HbQFSad3HosYbCkEkbjN"; // 填写Bucket名称,例如examplebucket。 var bucketName = "ltcloudfile"; int year = DateTime.Now.Year; int month = DateTime.Now.Month; int day = DateTime.Now.Day; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 var objectName = "supplierFile/" + year + "/" + month + "/" + day + "/" + fileName; // 填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。 string region = "cn-hangzhou"; // 创建ClientConfiguration实例,按照您的需要修改默认参数。 var conf = new ClientConfiguration(); // 设置v4签名。 conf.SignatureVersion = SignatureVersion.V4; // 创建OssClient实例。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); var uploadId = ""; try { // 定义上传的文件及所属Bucket的名称。您可以在InitiateMultipartUploadRequest中设置ObjectMeta,但不必指定其中的ContentLength。 var request = new InitiateMultipartUploadRequest(bucketName, objectName); var result = client.InitiateMultipartUpload(request); uploadId = result.UploadId; } catch (Exception ex) { writeLog("Init multi part upload failed, {0}" + ex.Message); Environment.Exit(1); } // 计算分片总数。 // 分片最小值为100 KB,最大值为5 GB。最后一个分片的大小允许小于100 KB。 var partSize = 10 * 1024 * 1024; var fi = new FileInfo(filePath); var fileSize = fi.Length; var partCount = fileSize / partSize; if (fileSize % partSize != 0) { partCount++; } var partETags = new List(); try { using (var fs = File.Open(filePath, FileMode.Open)) { for (var i = 0; i < partCount; i++) { var skipBytes = (long)partSize * i; // 定位到本次上传的起始位置。 fs.Seek(skipBytes, 0); // 计算本次上传的分片大小,最后一片为剩余的数据大小。 var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes); var request = new UploadPartRequest(bucketName, objectName, uploadId) { InputStream = fs, PartSize = size, PartNumber = i + 1 }; // 调用UploadPart接口执行上传功能,返回结果中包含了这个数据片的ETag值。 var result = client.UploadPart(request); partETags.Add(result.PartETag); writeLog(string.Format(fileName + ":finish {0}/{1}", partETags.Count, partCount)); } writeLog(string.Format(fileName + ":Put multi part upload succeeded")); } } catch (Exception ex) { writeLog(string.Format("Put multi part upload failed, {0}", ex.Message)); Environment.Exit(1); } // 当分片上传成功后,合并分片。 try { var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId); foreach (var partETag in partETags) { completeMultipartUploadRequest.PartETags.Add(partETag); } var result = client.CompleteMultipartUpload(completeMultipartUploadRequest); } catch (Exception ex) { writeLog(string.Format("complete multi part failed, {0}", ex.Message)); Environment.Exit(1); } return "https://ltcloudfile.oss-cn-hangzhou.aliyuncs.com/" + objectName; } /// 批量进行多个文件压缩到一个文件 /// /// 文件列表(绝对路径) 这里用的数组,你可以用list 等或者 /// 生成的zip文件名称 private void ZipFileDownload(int userId, List ctidLst, List files, string zipFileName, int onlyDownFile, int isFromClient) { // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 var endpoint = "https://oss-cn-fuzhou.aliyuncs.com"; // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 var accessKeyId = "LTAI5tE7wuNkeT9jZ42bQnyr"; var accessKeySecret = "NnutvWhKl4HbQFSad3HosYbCkEkbjN"; // 填写Bucket名称,例如examplebucket。 var bucketName = "dfdiyfile"; // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 var objectName = "exampledir/exampleobject.txt"; // 填写字符串。 var objectContent = "More than just cloud."; // 填写Bucket所在地域对应的Region。以华东1(杭州)为例,Region填写为cn-hangzhou。 const string region = "oss-cn-fuzhou"; // 创建ClientConfiguration实例,按照您的需要修改默认参数。 var conf = new ClientConfiguration(); // 设置v4签名。 conf.SignatureVersion = SignatureVersion.V4; // 创建OssClient实例。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); try { MemoryStream ms = new MemoryStream(); byte[] buffer = null; using (ZipFile file = ZipFile.Create(ms)) { file.BeginUpdate(); //file.NameTransform = new ZipNameTransform(); file.NameTransform = new MyNameTransfom(); file.Add("C:\\Users\\231010\\Downloads\\setup.exe"); file.CommitUpdate(); buffer = new byte[ms.Length]; ms.Position = 0; ms.Read(buffer, 0, buffer.Length); //读取文件内容(1次读ms.Length/1024M) ms.Flush(); ms.Close(); } MemoryStream requestContent = new MemoryStream(buffer); // 上传文件。 client.PutObject(bucketName, objectName, requestContent); Console.WriteLine("Put object succeeded"); } catch (Exception ex) { Console.WriteLine("Put object failed, {0}", ex.Message); } conSuc("上传成功!"); return; //for (int i = 0; i < addFiles.Count; i++) //{ // updateIsDownSuccess(userId, addCtid[i]); //} //StringBuilder sql = new StringBuilder(); //string tids = string.Join(",", addCtid); //sql.AppendFormat("update CE_ErpTradeCell set OrderState = 6 where ctid in ({0}) ;", ("'" + tids.Replace(",", "','") + "'")); //CeErpTradeCell.ExecuteNonQuery(sql.ToString()); //sql = new StringBuilder(); //sql.AppendFormat("insert into CE_ErpTradeLog(tid,orderstate,userid,operatetime,con) select ctid,{1},{2},getdate(),'{3}' from ce_erptradecell where ctid in ({0}) ;", ("'" + tids.Replace(",", "','") + "'"), (int)OrderState.下单完成, userId, "下载设计文件"); //CeErpTradeCell.ExecuteNonQuery(sql.ToString()); } //public static object downfileObj = new object(); private void downLoadFile(int userId, string ctid, string file, int onlyDownFile, int isFromClient) { string filePath = file; string dfile = Path.GetFileName(file); FileStream fs = new FileStream(filePath, FileMode.Open); byte[] bytes = new byte[(int)fs.Length]; fs.Read(bytes, 0, bytes.Length); fs.Close(); Response.Clear(); // Response.ClearContent(); Response.ClearHeaders(); Response.ContentType = "application/octet-stream"; //通知浏览器下载文件而不是打开\\fileDownload=true; path=/ Response.AddHeader("Set-Cookie", "fileDownload=true; path=/;"); //Response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(dfile, System.Text.Encoding.UTF8)); Response.AddHeader("Content-Length", bytes.Length.ToString()); Response.AddHeader("Access-Control-Expose-Headers", "Content-Disposition"); Response.BinaryWrite(bytes); Response.Flush(); //updateIsDownSuccess(userId, ctid); //StringBuilder sql = new StringBuilder(); //string tids = string.Join(",", ctid); //sql.AppendFormat("update CE_ErpTradeCell set OrderState = 6 where ctid in ({0}) ;", ("'" + tids.Replace(",", "','") + "'")); //CeErpTradeCell.ExecuteNonQuery(sql.ToString()); //sql = new StringBuilder(); //sql.AppendFormat("insert into CE_ErpTradeLog(tid,orderstate,userid,operatetime,con) select ctid,{1},{2},getdate(),'{3}' from ce_erptradecell where ctid in ({0}) ;", ("'" + tids.Replace(",", "','") + "'"), (int)OrderState.下单完成, userId, "下载设计文件"); //CeErpTradeCell.ExecuteNonQuery(sql.ToString()); } /// /// 压缩大文件夹(分块处理) /// public static void ZipLargeFolder(string sourceFolder, string zipFilePath, int supplierId, CompressionLevel compressionLevel = CompressionLevel.Optimal) { // 参数验证 if (string.IsNullOrEmpty(sourceFolder)) throw new ArgumentNullException("sourceFolder", "源文件夹路径不能为空"); if (string.IsNullOrEmpty(zipFilePath)) throw new ArgumentNullException("zipFilePath", "压缩文件路径不能为空"); if (!Directory.Exists(sourceFolder)) { throw new DirectoryNotFoundException("源文件夹不存在: " + sourceFolder); } // 确保目标目录存在 var zipDir = Path.GetDirectoryName(zipFilePath); if (!string.IsNullOrEmpty(zipDir) && !Directory.Exists(zipDir)) { Directory.CreateDirectory(zipDir); } if (File.Exists(zipFilePath)) { File.Delete(zipFilePath); } // 使用 EnumerateFiles 减少内存使用 var files = Directory.EnumerateFiles(sourceFolder, "*.*", SearchOption.AllDirectories); using (var fileStream = new FileStream(zipFilePath, FileMode.Create, FileAccess.Write, FileShare.None, 8192)) using (var zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Create, true)) { foreach (var file in files) { try { string fileName = Path.GetFileName(file); if (supplierId == 14) { fileName = dealMemoName(fileName); } // 获取相对路径 string relativePath = GetRelativePath(sourceFolder, file); // 创建zip条目 var entry = zipArchive.CreateEntry(fileName, compressionLevel); // 使用流写入文件内容 using (var entryStream = entry.Open()) using (var stream = File.OpenRead(file)) { // 使用更大的缓冲区提高性能 stream.CopyTo(entryStream, 81920); } } catch (Exception ex) { // 记录错误但继续处理其他文件 writeLog("压缩文件失败: 错误: " + ex); } } } } // 辅助方法:获取相对路径 private static string GetRelativePath(string basePath, string fullPath) { Uri baseUri = new Uri(basePath + Path.DirectorySeparatorChar); Uri fullUri = new Uri(fullPath); Uri relativeUri = baseUri.MakeRelativeUri(fullUri); return Uri.UnescapeDataString(relativeUri.ToString()).Replace('\\', '/'); } public static void addLog(string ctid, int userid, string con, int orderState = 0, int aftersaleState = 0) { CeErpTradeLog log = new CeErpTradeLog(); log.tid = ctid; log.UserId = userid; log.Con = con; log.OrderState = orderState; log.AfterSaleState = aftersaleState; log.OperateTime = DateTime.Now; log.Create(); } private static string logPath = ConfigurationManager.AppSettings["curPath"] + "\\log"; private static object logFlag = new object(); public static void writeLog(string log) { lock (logFlag) { using (FileStream fileStream = new FileStream(logPath + "\\" + DateTime.Now.ToString("yy-MM-dd") + ".log", FileMode.Append, FileAccess.Write)) { using (StreamWriter sw = new StreamWriter(fileStream, Encoding.Default)) { sw.Write(log + " ------时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n"); sw.Flush(); } } } } }