瀏覽代碼

優化ImageQuang

JAELYS 4 年之前
父節點
當前提交
4cc89f98d9

+ 26 - 26
TEAMModelOS.SDK/Extension/Utils.cs

@@ -98,36 +98,36 @@ namespace TEAMModelOS.SDK.Extension
         /// <summary>
         /// 判斷圖片格式
         /// </summary>
-        /// <param name="fileStream"></param>
+        /// <param name="stream">傳入Stream,注意請自行釋放</param>
         /// <returns></returns>
-        public static (bool, string) ImageValidateByStream(Stream fileStream)
+        public static (bool, string) ImageValidateByStream(Stream stream)
         {
-            using (BinaryReader br = new BinaryReader(fileStream))
+            int length = 20;
+            BinaryReader br = new BinaryReader(stream);
+            StringBuilder stringBuilder = new StringBuilder();
+            while (length > 0)
             {
-                int length = 20;
-                StringBuilder stringBuilder = new StringBuilder();
-                while (length > 0)
-                {
-                    byte tempByte = br.ReadByte();
-                    stringBuilder.Append(Convert.ToString(tempByte, 16));
-                    stringBuilder.Append(",");
-                    length--;
-                }
-                string fileheader = stringBuilder.ToString().ToUpper();
-                if (string.IsNullOrWhiteSpace(fileheader))
-                    return (false, "");
-
-                if (fileheader.StartsWith("FF,D8,") || fileheader.StartsWith("42,4D,"))
-                    return (true, "jpg");
-                if (fileheader.StartsWith("89,50,4E,47,D,A,1A,A,"))
-                    return (true, "png");
-                if (fileheader.StartsWith("47,49,46,38,39,61,") || fileheader.StartsWith("47,49,46,38,37,61,"))
-                    return (true, "gif");
-                //if (fileheader.StartsWith("4D,4D") || fileheader.StartsWith("49,49") || fileheader.StartsWith("46,4F,52,4D"))
-                //    return (true, "tif");
-                return (false, "");
+                byte tempByte = br.ReadByte();
+                stringBuilder.Append(Convert.ToString(tempByte, 16));
+                stringBuilder.Append(",");
+                length--;
             }
-        }       
+            stream.Position = 0; //指針回歸為0
+            string fileheader = stringBuilder.ToString().ToUpper();
+            if (string.IsNullOrWhiteSpace(fileheader))
+                return (false, "");
+
+            if (fileheader.StartsWith("FF,D8,") || fileheader.StartsWith("42,4D,"))
+                return (true, "jpg");
+            if (fileheader.StartsWith("89,50,4E,47,D,A,1A,A,"))
+                return (true, "png");
+            if (fileheader.StartsWith("47,49,46,38,39,61,") || fileheader.StartsWith("47,49,46,38,37,61,"))
+                return (true, "gif");
+            //if (fileheader.StartsWith("4D,4D") || fileheader.StartsWith("49,49") || fileheader.StartsWith("46,4F,52,4D"))
+            //    return (true, "tif");
+            return (false, "");
+
+        }
         #endregion
 
 

+ 11 - 7
TEAMModelOS/Controllers/Core/CoreController.cs

@@ -34,9 +34,9 @@ namespace TEAMModelOS.Controllers.Core
         /// <returns></returns>
         [HttpPost("image-quant")]
         public async Task<IActionResult> ImageQuang(List<ImageQuangRequest> request)
-        {            
+        {
             if (request.Count < 1) return BadRequest();
-            Regex rex = new Regex(@"data:(?<key1>image.+?);base64,(?<key2>.+)");            
+            Regex rex = new Regex(@"data:(?<key1>image.+?);base64,(?<key2>.+)");
 
             List<object> respons = new List<object>();
             var quantizer = new PngQuantizer();
@@ -45,17 +45,21 @@ namespace TEAMModelOS.Controllers.Core
                 string trim = Regex.Replace(item.base64, @"\s", ""); //移除空白
                 Match match = rex.Match(trim);
                 string oldtype = match.Groups["key1"].Value;
-                string oldbase64 = match.Groups["key2"].Value;                
+                string oldbase64 = match.Groups["key2"].Value;
                 byte[] oldbase64data = Convert.FromBase64String(oldbase64);
                 using var oldbase64ms = new MemoryStream(oldbase64data);
                 var (isimg, type) = Utils.ImageValidateByStream(oldbase64ms); //驗證圖片格式
+                //oldbase64ms.Position = 0;
                 if (isimg)
                 {
                     string imgname = string.Empty;
                     if (!string.IsNullOrWhiteSpace(item.blob)) //檢查是否需要保存原圖到blob
                     {
-                        imgname = $"{Guid.NewGuid().ToString("N")}.{type}"; //重新命名原始圖片名稱
-                        await _azureStorage.GetBlobContainerClient(item.blob).GetBlobClient($"{item.blob}/{imgname}").UploadAsync(oldbase64ms, new BlobHttpHeaders { ContentType = oldtype });
+                        imgname = $"{Guid.NewGuid():N}.{type}"; //重新命名原始圖片名稱
+                        string Containername = item.blob.Substring(0, item.blob.IndexOf("/"));
+
+                        string filepath = $"{item.blob[(item.blob.Trim('/').IndexOf("/") + 1)..]}/{imgname}"; //處理路徑,避免多餘的字符
+                        await _azureStorage.GetBlobContainerClient(Containername).GetBlobClient(filepath).UploadAsync(oldbase64ms, new BlobHttpHeaders { ContentType = oldtype });
                     }
                     using var quantized = quantizer.QuantizeImageFromBase64(oldbase64ms, item.width, item.height); //PNG輕量化
                     using var newbase64ms = new MemoryStream();
@@ -71,7 +75,7 @@ namespace TEAMModelOS.Controllers.Core
                 }
             }
             return Ok(respons);
-            
-        }   
+
+        }
     }
 }

+ 6 - 4
TEAMModelOS/Models/Request/ImageQuangRequest.cs

@@ -5,6 +5,7 @@ using System.Threading.Tasks;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 using TEAMModelOS.SDK.Extension;
+using System.ComponentModel.DataAnnotations;
 
 namespace TEAMModelOS.Models.Request
 {
@@ -13,13 +14,14 @@ namespace TEAMModelOS.Models.Request
     /// </summary>
     public class ImageQuangRequest
     {
-       public string base64 { get; }
+        [Required(ErrorMessage = "{0} 必须填写")]
+        public string base64 { get; set; }
         //[JsonNumberHandling] //.NET 5 支持
         [JsonConverter(typeof(JsonIntToStringConverter))]
-        public int width { get; }
+        public int width { get; set; }
         //[JsonNumberHandling] //.NET 5 支持
         [JsonConverter(typeof(JsonIntToStringConverter))]
-        public int height { get; }
-        public string blob { get; }
+        public int height { get; set; }
+        public string blob { get; set; }
     }
 }