From 2ce970877bd41a1f1df4acd695daf1ef91421387 Mon Sep 17 00:00:00 2001 From: Argo-Asicotech Date: Wed, 18 Jan 2023 11:34:58 +0800 Subject: [PATCH 1/4] =?UTF-8?q?refactor:=20RequestBase64ImageFileAsync=20?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=B8=BA=E6=89=A9=E5=B1=95=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # src/BootstrapBlazor/Components/Upload/UploadFile.cs --- .../Extensions/UploadFileExtensions.cs | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/BootstrapBlazor/Extensions/UploadFileExtensions.cs diff --git a/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs b/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs new file mode 100644 index 00000000000..87b630d7dc9 --- /dev/null +++ b/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs @@ -0,0 +1,45 @@ +// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +// Website: https://www.blazor.zone or https://argozhang.github.io/ + +using Microsoft.AspNetCore.Components.Forms; + +namespace BootstrapBlazor.Components; + +/// +/// UploadFile 扩展方法类 +/// +public static class UploadFileExtensions +{ + /// + /// 获取 base64 格式图片字符串 + /// + /// + /// + /// + /// + /// + /// + [ExcludeFromCodeCoverage] + public static async Task RequestBase64ImageFileAsync(this UploadFile upload, string format, int maxWidth, int maxHeight, long maxAllowedSize = 512000, CancellationToken token = default) + { + if (upload.File != null) + { + try + { + var imageFile = await upload.File.RequestImageFileAsync(format, maxWidth, maxHeight); + using var fileStream = imageFile.OpenReadStream(maxAllowedSize, token); + using var memoryStream = new MemoryStream(); + await fileStream.CopyToAsync(memoryStream, token); + upload.PrevUrl = $"data:{format};base64,{Convert.ToBase64String(memoryStream.ToArray())}"; + upload.Uploaded = true; + } + catch (Exception ex) + { + upload.Code = 1004; + upload.PrevUrl = null; + upload.Error = ex.Message; + } + } + } +} From 41e2b38c538b5bc5b0c5d8da0c94b47429cc4205 Mon Sep 17 00:00:00 2001 From: Argo-Asicotech Date: Wed, 18 Jan 2023 11:36:46 +0800 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20GetBytes=20=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=89=A9=E5=B1=95=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # src/BootstrapBlazor/Components/Upload/UploadFile.cs --- .../Extensions/UploadFileExtensions.cs | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs b/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs index 87b630d7dc9..910850b8d42 100644 --- a/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs +++ b/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs @@ -42,4 +42,82 @@ public static async Task RequestBase64ImageFileAsync(this UploadFile upload, str } } } + + /// + /// 获得图片字节数组方法 + /// + /// + /// + /// + /// + /// + /// + /// + [ExcludeFromCodeCoverage] + [Obsolete("Use GetBytes method")] + public static Task GetByteArray(this UploadFile upload, string format, int maxWidth, int maxHeight, long maxAllowedSize = 512000, CancellationToken token = default) => upload.GetBytes(format, maxWidth, maxHeight, maxAllowedSize, token); + + /// + /// 获得图片字节数组方法 + /// + /// + /// + /// + /// + /// + /// + /// + [ExcludeFromCodeCoverage] + public static async Task GetBytes(this UploadFile upload, string format, int maxWidth, int maxHeight, long maxAllowedSize = 512000, CancellationToken token = default) + { + byte[]? ret = null; + if (upload.File != null) + { + try + { + var imageFile = await upload.File.RequestImageFileAsync(format, maxWidth, maxHeight); + using var fileStream = imageFile.OpenReadStream(maxAllowedSize, token); + using var memoryStream = new MemoryStream(); + await fileStream.CopyToAsync(memoryStream, token); + ret = memoryStream.ToArray(); + } + catch (Exception ex) + { + upload.Code = 1004; + upload.Error = ex.Message; + upload.PrevUrl = null; + } + } + return ret; + } + + /// + /// 获得图片字节数组方法 + /// + /// + /// + /// + /// + [ExcludeFromCodeCoverage] + public static async Task GetBytes(this UploadFile upload, long maxAllowedSize = 512000, CancellationToken token = default) + { + byte[]? ret = null; + if (upload.File != null) + { + try + { + using var fileStream = upload.File.OpenReadStream(maxAllowedSize, token); + using var memoryStream = new MemoryStream(); + await fileStream.CopyToAsync(memoryStream, token); + ret = memoryStream.ToArray(); + } + catch (Exception ex) + { + upload.Code = 1004; + upload.Error = ex.Message; + upload.PrevUrl = null; + } + } + return ret; + } } From 59e3f32740a7e2913d2e4b3dcfab4cf08da832ca Mon Sep 17 00:00:00 2001 From: Argo-Asicotech Date: Wed, 18 Jan 2023 11:38:31 +0800 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20SaveToFile=20=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=89=A9=E5=B1=95=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # src/BootstrapBlazor/Components/Upload/UploadFile.cs --- .../Extensions/UploadFileExtensions.cs | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs b/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs index 910850b8d42..3849440019b 100644 --- a/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs +++ b/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs @@ -43,6 +43,80 @@ public static async Task RequestBase64ImageFileAsync(this UploadFile upload, str } } + /// + /// 保存到文件 + /// + /// + /// + /// + /// + /// + [ExcludeFromCodeCoverage] + public static async Task SaveToFile(this UploadFile upload, string fileName, long maxAllowedSize = 512000, CancellationToken token = default) + { + var ret = false; + if (upload.File != null) + { + // 文件保护,如果文件存在则先删除 + if (File.Exists(fileName)) + { + try + { + File.Delete(fileName); + } + catch (Exception ex) + { + upload.Code = 1002; + upload.Error = ex.Message; + } + } + + if (upload.Code == 0) + { + var folder = Path.GetDirectoryName(fileName); + if (!string.IsNullOrEmpty(folder) && !Directory.Exists(folder)) + { + Directory.CreateDirectory(folder); + } + + using var uploadFile = File.OpenWrite(fileName); + try + { + // 打开文件流 + var stream = upload.File.OpenReadStream(maxAllowedSize, token); + var buffer = new byte[4 * 1096]; + int bytesRead = 0; + double totalRead = 0; + + // 开始读取文件 + while ((bytesRead = await stream.ReadAsync(buffer, token)) > 0) + { + totalRead += bytesRead; + await uploadFile.WriteAsync(buffer.AsMemory(0, bytesRead), token); + + if (upload.UpdateCallback != null) + { + var percent = (int)((totalRead / upload.File.Size) * 100); + if (percent > upload.ProgressPercent) + { + upload.ProgressPercent = percent; + upload.UpdateCallback(upload); + } + } + } + upload.Uploaded = true; + ret = true; + } + catch (Exception ex) + { + upload.Code = 1003; + upload.Error = ex.Message; + } + } + } + return ret; + } + /// /// 获得图片字节数组方法 /// From 833d7ab0be1f29997934cd610e90f58b5e98f8a2 Mon Sep 17 00:00:00 2001 From: Argo-Asicotech Date: Wed, 18 Jan 2023 11:41:28 +0800 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=94=B9=20SaveToFile?= =?UTF-8?q?=20=E6=96=B9=E6=B3=95=E4=B8=BA=E5=BC=82=E6=AD=A5=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Samples/Uploads.razor.cs | 2 +- .../Extensions/UploadFileExtensions.cs | 24 ++++++++++++++----- test/UnitTest/Components/UploadTest.cs | 4 ++-- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/BootstrapBlazor.Shared/Samples/Uploads.razor.cs b/src/BootstrapBlazor.Shared/Samples/Uploads.razor.cs index 099e2c5627b..ed7b77af1ba 100644 --- a/src/BootstrapBlazor.Shared/Samples/Uploads.razor.cs +++ b/src/BootstrapBlazor.Shared/Samples/Uploads.razor.cs @@ -150,7 +150,7 @@ private async Task SaveToFile(UploadFile file) var fileName = Path.Combine(uploaderFolder, file.FileName); ReadToken ??= new CancellationTokenSource(); - ret = await file.SaveToFile(fileName, MaxFileLength, ReadToken.Token); + ret = await file.SaveToFileAsync(fileName, MaxFileLength, ReadToken.Token); if (ret) { diff --git a/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs b/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs index 3849440019b..118154a014f 100644 --- a/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs +++ b/src/BootstrapBlazor/Extensions/UploadFileExtensions.cs @@ -44,7 +44,7 @@ public static async Task RequestBase64ImageFileAsync(this UploadFile upload, str } /// - /// 保存到文件 + /// 保存到文件方法 已过期 /// /// /// @@ -52,7 +52,19 @@ public static async Task RequestBase64ImageFileAsync(this UploadFile upload, str /// /// [ExcludeFromCodeCoverage] - public static async Task SaveToFile(this UploadFile upload, string fileName, long maxAllowedSize = 512000, CancellationToken token = default) + [Obsolete("Use SaveToFileAsync method")] + public static Task SaveToFile(this UploadFile upload, string fileName, long maxAllowedSize = 512000, CancellationToken token = default) => upload.SaveToFileAsync(fileName, maxAllowedSize, token); + + /// + /// 保存到文件方法 + /// + /// + /// + /// + /// + /// + [ExcludeFromCodeCoverage] + public static async Task SaveToFileAsync(this UploadFile upload, string fileName, long maxAllowedSize = 512000, CancellationToken token = default) { var ret = false; if (upload.File != null) @@ -128,8 +140,8 @@ public static async Task SaveToFile(this UploadFile upload, string fileNam /// /// [ExcludeFromCodeCoverage] - [Obsolete("Use GetBytes method")] - public static Task GetByteArray(this UploadFile upload, string format, int maxWidth, int maxHeight, long maxAllowedSize = 512000, CancellationToken token = default) => upload.GetBytes(format, maxWidth, maxHeight, maxAllowedSize, token); + [Obsolete("Use GetBytesAsync method")] + public static Task GetByteArray(this UploadFile upload, string format, int maxWidth, int maxHeight, long maxAllowedSize = 512000, CancellationToken token = default) => upload.GetBytesAsync(format, maxWidth, maxHeight, maxAllowedSize, token); /// /// 获得图片字节数组方法 @@ -142,7 +154,7 @@ public static async Task SaveToFile(this UploadFile upload, string fileNam /// /// [ExcludeFromCodeCoverage] - public static async Task GetBytes(this UploadFile upload, string format, int maxWidth, int maxHeight, long maxAllowedSize = 512000, CancellationToken token = default) + public static async Task GetBytesAsync(this UploadFile upload, string format, int maxWidth, int maxHeight, long maxAllowedSize = 512000, CancellationToken token = default) { byte[]? ret = null; if (upload.File != null) @@ -173,7 +185,7 @@ public static async Task SaveToFile(this UploadFile upload, string fileNam /// /// [ExcludeFromCodeCoverage] - public static async Task GetBytes(this UploadFile upload, long maxAllowedSize = 512000, CancellationToken token = default) + public static async Task GetBytesAsync(this UploadFile upload, long maxAllowedSize = 512000, CancellationToken token = default) { byte[]? ret = null; if (upload.File != null) diff --git a/test/UnitTest/Components/UploadTest.cs b/test/UnitTest/Components/UploadTest.cs index bb1c7398905..336bb9175c6 100644 --- a/test/UnitTest/Components/UploadTest.cs +++ b/test/UnitTest/Components/UploadTest.cs @@ -527,7 +527,7 @@ public void ButtonUpload_ShowProgress_Ok() pb.Add(a => a.ShowProgress, true); pb.Add(a => a.OnChange, async file => { - await file.SaveToFile("1.txt"); + await file.SaveToFileAsync("1.txt"); }); }); var input = cut.FindComponent(); @@ -680,7 +680,7 @@ public async Task CardUpload_Ok() pb.Add(a => a.ShowProgress, true); pb.Add(a => a.OnChange, async file => { - await file.SaveToFile("1.txt"); + await file.SaveToFileAsync("1.txt"); }); }); var input = cut.FindComponent();