Browse Source

add controller from imagequant and json converter 未完成

JAELYS 4 năm trước cách đây
mục cha
commit
21b6e74919

+ 41 - 0
TEAMModelOS.SDK/Extension/JsonIntToStringConverter.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Buffers;
+using System.Buffers.Text;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace TEAMModelOS.SDK.Extension
+{
+    /// <summary>
+    /// 允许或写入带引号的数字,之後.NET 5就不用這個轉換,改用[JsonNumberHandling]
+    /// </summary>
+    public class JsonIntToStringConverter : JsonConverter<int>
+    {
+        public override int Read(
+            ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
+        {
+            if (reader.TokenType == JsonTokenType.String)
+            {
+                ReadOnlySpan<byte> span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
+
+                if (Utf8Parser.TryParse(span, out int number, out int bytesConsumed) && span.Length == bytesConsumed)
+                {
+                    return number;
+                }
+
+                if (int.TryParse(reader.GetString(), out number))
+                {
+                    return number;
+                }
+            }
+
+            return reader.GetInt32();
+        }
+
+        public override void Write(Utf8JsonWriter writer, int longValue, JsonSerializerOptions options) =>
+            writer.WriteStringValue(longValue.ToString());
+        
+    }
+}

+ 22 - 3
TEAMModelOS/Controllers/Core/CoreController.cs

@@ -1,11 +1,16 @@
+using Azure.Storage.Blobs.Models;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
+using System.Drawing.Imaging;
+using System.IO;
 using System.Linq;
 using System.Linq;
 using System.Text.Json;
 using System.Text.Json;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using TEAMModelOS.Models.Request;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.PngQuant;
 
 
 namespace TEAMModelOS.Controllers.Core
 namespace TEAMModelOS.Controllers.Core
 {
 {
@@ -21,9 +26,23 @@ namespace TEAMModelOS.Controllers.Core
         }
         }
 
 
         [HttpPost("image-quant")]
         [HttpPost("image-quant")]
-        public async Task<IActionResult> ImageQuang(JsonElement request)
-        {
-            if (!request.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
+        public async Task<IActionResult> ImageQuang(List<ImageQuangRequest> request)
+        {            
+            if (request.Count < 1) return BadRequest();
+            List<object> respons = new List<object>();
+            var quantizer = new PngQuantizer();
+            foreach (var item in request)
+            {
+                using var quantized = quantizer.QuantizeImageFromBase64(item.base64, item.width, item.height);
+                using var ms = new MemoryStream();
+                quantized.Save(ms, ImageFormat.Png);
+                byte[] data = ms.ToArray();
+                string base64 = Convert.ToBase64String(data);
+                var name = $"{Guid.NewGuid().ToString("N")}.png";
+                respons.Add(new { base64 = base64, blob = name });
+                //await _azureStorage.GetBlobContainerClient(item.blob).GetBlobClient(name).UploadAsync(ms, new BlobHttpHeaders { ContentType = "image/png" });
+                   // await _azureStorage.GetBlobContainerClient(item.blob).UploadBlobAsync()
+            }
 
 
             return Ok();
             return Ok();
         }   
         }   

+ 3 - 1
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -16,6 +16,7 @@ using TEAMModelOS.Models;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Extension;
+using TEAMModelOS.Filter;
 
 
 namespace TEAMModelOS.Controllers
 namespace TEAMModelOS.Controllers
 {
 {
@@ -158,9 +159,10 @@ namespace TEAMModelOS.Controllers
 
 
         //TODO 此API需處理對應前端返回的相關數據
         //TODO 此API需處理對應前端返回的相關數據
         [ProducesDefaultResponseType]
         [ProducesDefaultResponseType]
-        [HttpPost("get-school-info")]
+        [HttpPost("get-school-info")]        
         public async Task<IActionResult> GetSchoolInfo(JsonElement requert)
         public async Task<IActionResult> GetSchoolInfo(JsonElement requert)
         {
         {
+
             if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
             if (!requert.TryGetProperty("id_token", out JsonElement id_token)) return BadRequest();
             if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
             if (!requert.TryGetProperty("school_code", out JsonElement school_code)) return BadRequest();
             var jwt = new JwtSecurityToken(id_token.GetString());
             var jwt = new JwtSecurityToken(id_token.GetString());

+ 22 - 0
TEAMModelOS/Models/Request/ImageQuangRequest.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using TEAMModelOS.SDK.Extension;
+
+namespace TEAMModelOS.Models.Request
+{
+    public class ImageQuangRequest
+    {
+       public string base64 { get; }
+        //[JsonNumberHandling] //.NET 5 支持
+        [JsonConverter(typeof(JsonIntToStringConverter))]
+        public int width { get; }
+        //[JsonNumberHandling] //.NET 5 支持
+        [JsonConverter(typeof(JsonIntToStringConverter))]
+        public int height { get; }
+        public string blob { get; }
+    }
+}

+ 1 - 1
TEAMModelOS/Startup.cs

@@ -129,7 +129,7 @@ namespace TEAMModelOS
             app.UseRouting();
             app.UseRouting();
 
 
             app.UseCors(MyAllowSpecificOrigins); //使用跨域設定
             app.UseCors(MyAllowSpecificOrigins); //使用跨域設定
-            //app.UseHttpsRedirection(); //開發中暫時關掉
+            app.UseHttpsRedirection(); //開發中暫時關掉
 
 
             //如果应用使用身份验证/授权功能(如 AuthorizePage 或 [Authorize]),请将对 UseAuthentication 和 UseAuthorization的
             //如果应用使用身份验证/授权功能(如 AuthorizePage 或 [Authorize]),请将对 UseAuthentication 和 UseAuthorization的
             //调用放在之后、UseRouting 和 UseCors,但在 UseEndpoints之前
             //调用放在之后、UseRouting 和 UseCors,但在 UseEndpoints之前