From 809d3df2426628f1c607945fe6c922171764a252 Mon Sep 17 00:00:00 2001 From: tdx Date: Thu, 23 Apr 2026 09:09:45 +0000 Subject: [PATCH] SVN r1160 SVN-Revision: r1160 --- 插件库/Lskj.Util/HttpHelper.cs | 69 +++++++++++++ 插件库/Lskj.Util/UploadFileUtil.cs | 152 +++++++++++++++++++++++++++++ 2 files changed, 221 insertions(+) diff --git a/插件库/Lskj.Util/HttpHelper.cs b/插件库/Lskj.Util/HttpHelper.cs index 37481b7..ed3aa1f 100644 --- a/插件库/Lskj.Util/HttpHelper.cs +++ b/插件库/Lskj.Util/HttpHelper.cs @@ -170,6 +170,75 @@ namespace Lskj.Util return httpWebResponse; } } + /// + /// 分片上传 + /// + /// + /// + /// + /// + /// + /// + public static HttpWebResponse PostFileChunk(string url, byte[] fileBytes, string fileName, Dictionary headerDic, out string result) + { + HttpWebResponse httpWebResponse = null; + try + { + string boundary = "----WebKitFormBoundary" + DateTime.Now.Ticks.ToString("x"); + + HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); + httpWebRequest.Method = "POST"; + httpWebRequest.Accept = Accept; + httpWebRequest.UserAgent = UserAgent; + httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary; + + if (headerDic != null) + { + foreach (var item in headerDic) + { + if (!item.Key.Equals("Content-Type")) + { + httpWebRequest.Headers.Add(item.Key, item.Value); + } + } + } + + string header = + "--" + boundary + "\r\n" + + "Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n" + + "Content-Type: application/octet-stream\r\n\r\n"; + + string footer = "\r\n--" + boundary + "--\r\n"; + + byte[] headerBytes = Encoding.UTF8.GetBytes(header); + byte[] footerBytes = Encoding.UTF8.GetBytes(footer); + + httpWebRequest.ContentLength = headerBytes.Length + fileBytes.Length + footerBytes.Length; + + Stream stream = httpWebRequest.GetRequestStream(); + stream.Write(headerBytes, 0, headerBytes.Length); + stream.Write(fileBytes, 0, fileBytes.Length); + stream.Write(footerBytes, 0, footerBytes.Length); + stream.Close(); + + httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + + Stream responseStream = httpWebResponse.GetResponseStream(); + StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8); + result = streamReader.ReadToEnd(); + streamReader.Close(); + responseStream.Close(); + + return httpWebResponse; + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + result = ex.Message; + return httpWebResponse; + } + } + /// /// url转换 /// diff --git a/插件库/Lskj.Util/UploadFileUtil.cs b/插件库/Lskj.Util/UploadFileUtil.cs index 77792e1..3f217dc 100644 --- a/插件库/Lskj.Util/UploadFileUtil.cs +++ b/插件库/Lskj.Util/UploadFileUtil.cs @@ -107,6 +107,158 @@ namespace Lskj.Util } return isUpload; } + public static bool UploadFile(string token, string postUrl, string filePath, string moduleCode, string idValue, string speciesno, out string fileId, out string rtnMsg) + { + bool isUpload = false; + fileId = ""; + rtnMsg = ""; + + try + { + FileInfo fileInfo = new FileInfo(filePath); + + int pageSize = 1 * 1024 * 1024; + long totalSize = fileInfo.Length; + long position = 0; + int comfirm = 0; + int encode = 4; + int failNum = 0; + bool hasFail = false; + + string uploadToken = Guid.NewGuid().ToString("N").Substring(0, 24); + string uploadFileName = Path.GetFileName(filePath); + + // 如果你后台没有 DoWebUploadSafe,就改回 DoWebUpload + string uploadMethod = "DoWebUpload"; + + Dictionary headerDic = new Dictionary(); + headerDic.Add("Authorization", "Bearer " + token); + + using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) + { + while (position < totalSize) + { + int readSize = (int)Math.Min(pageSize, totalSize - position); + byte[] buffer = new byte[readSize]; + + int realRead = fs.Read(buffer, 0, readSize); + if (realRead <= 0) + { + break; + } + + if (realRead != readSize) + { + byte[] tempBytes = new byte[realRead]; + Array.Copy(buffer, tempBytes, realRead); + buffer = tempBytes; + readSize = realRead; + } + + long tsp = GetUnixTime(); + + string uploadUrl = string.Format( + postUrl, + moduleCode, + HttpUtility.UrlEncode(idValue), + "file", + totalSize, + position, + HttpUtility.UrlEncode(uploadFileName), + uploadMethod, + HttpUtility.UrlEncode(speciesno), + comfirm, + encode, + uploadToken, + tsp + ); + + string result = ""; + HttpWebResponse webResponse = HttpHelper.PostFileChunk(uploadUrl, buffer, uploadFileName, headerDic, out result); + + if (webResponse != null && !string.IsNullOrEmpty(result)) + { + JObject jsonObject = (JObject)JsonConvert.DeserializeObject(result); + string isSuccess = jsonObject["success"] + ""; + + if (isSuccess.Equals("True", StringComparison.CurrentCultureIgnoreCase)) + { + failNum = 0; + + if (jsonObject.ContainsKey("data") && jsonObject["data"] != null && jsonObject["data"].Type == JTokenType.Object) + { + JObject dataObject = (JObject)jsonObject["data"]; + + if (dataObject.ContainsKey("FileName")) + { + uploadFileName = dataObject["FileName"] + ""; + } + } + + if (jsonObject.ContainsKey("other")) + { + fileId = jsonObject["other"] + ""; + } + + position += readSize; + } + else + { + string dataCode = jsonObject.ContainsKey("data") ? jsonObject["data"] + "" : ""; + + if (dataCode.Equals("9") && comfirm == 0) + { + comfirm = 1; + fs.Position = position; + continue; + } + + if (jsonObject.ContainsKey("msg")) + { + rtnMsg = jsonObject["msg"] + ""; + } + + failNum++; + + if (failNum < 2 && rtnMsg.IndexOf("权限") < 0 && rtnMsg.IndexOf("禁止") < 0) + { + fs.Position = position; + continue; + } + + hasFail = true; + break; + } + } + else + { + rtnMsg = "上传请求失败," + result; + hasFail = true; + break; + } + } + } + + if (!hasFail && position >= totalSize) + { + isUpload = true; + } + } + catch (Exception ex) + { + rtnMsg = ex.Message; + isUpload = false; + } + + return isUpload; + } + + private static long GetUnixTime() + { + DateTime startTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + return (long)(DateTime.UtcNow - startTime).TotalSeconds; + } + /// /// 上传文件 ///