@namespace WtmBlazorUtils @inherits WTComponent @inject WtmBlazorContext WtmBlazor @inject IJSRuntime JSRuntime @using System.Threading; @using System.Linq.Expressions; @using System.IO; @using System.Text.Json; @typeparam TValue
@if (dlist != null) { }
@code{ [Parameter] public int? ThumbWidth { get; set; } = 200; [Parameter] public int? ThumbHeight { get; set; } = 200; [Parameter] public TValue Value { get; set; } [Parameter] public EventCallback ValueChanged { get; set; } [Parameter] public Expression> ValueExpression { get; set; } [Parameter] public bool IsDisabled { get; set; } private bool IsMultiple { get { if (typeof(IEnumerable).IsAssignableFrom(typeof(TValue))) { return true; } else { return false; } } } [Parameter] public bool ShowLabel { get; set; } = true; [Parameter] public string LabelText { get; set; } = null; private Dictionary files { get; set; } = new Dictionary(); private List dlist = null; private ButtonUpload uploader { get; set; } private bool FileSet { get; set; } = false; protected TValue CurrentValue { get => Value; set { var hasChanged = !EqualityComparer.Default.Equals(value, Value); if (hasChanged) { Value = value; _ = ValueChanged.InvokeAsync(value); } } } protected override async Task OnInitializedAsync() { if (Value != null) { List temp = new List(); if (IsMultiple == false) { var rv = await WtmBlazor.Api.CallAPI($"/api/_file/GetFileInfo/{Value}", HttpMethodEnum.GET, new Dictionary()); if (rv.StatusCode == System.Net.HttpStatusCode.OK) { temp.Add(new UploadFile { FileName = rv.Data.FileName, Size = rv.Data.Length, PrevUrl = $"/api/_file/DownloadFile/{Value}" }); files.Add(Value.ToString(), $"/api/_file/DownloadFile/{Value}"); } else { Guid? ng = null; CurrentValue = (TValue)(object)ng; } dlist = temp; } else { var list = Value as IEnumerable; foreach (var item in list) { var rv = await WtmBlazor.Api.CallAPI($"/api/_file/GetFileInfo/{item.FileId}", HttpMethodEnum.GET, new object()); if (rv.StatusCode == System.Net.HttpStatusCode.OK) { temp.Add(new UploadFile { FileName = rv.Data.FileName, Size = rv.Data.Length, PrevUrl = $"/api/_file/DownloadFile/{item.FileId}" }); files.Add(item.FileId.ToString(), $"/api/_file/DownloadFile/{item.FileId}"); } } dlist = temp; } } else { dlist = new List(); } ClearDeletedIds(); await base.OnInitializedAsync(); } private async Task OnAvatarUpload(UploadFile file) { bool suc = false; if (file != null && file.File != null) { var format = file.File.ContentType; byte[] filedata = await GetFileData(file.File); var rv = await WtmBlazor.Api.CallAPI("/api/_file/Upload", HttpMethodEnum.POST, new Dictionary(), filedata, file.File.Name); if (rv.StatusCode == System.Net.HttpStatusCode.OK) { files.Add(rv.Data.Fields["Id"].ToString(), $"/api/_file/DownloadFile/{rv.Data.Fields["Id"]}"); file.PrevUrl = $"/api/_file/DownloadFile/{rv.Data.Fields["Id"]}"; if (IsMultiple) { CurrentValue = (TValue)PropertyHelper.MakeList(typeof(TValue).GetGenericArguments()[0], "FileId", files.Select(x => x.Key).ToArray()); } else { CurrentValue = (TValue)(object)(new Guid(files.First().Key)); } suc = true; } } if (suc == false) { await WtmBlazor.Toast.Error(content: WtmBlazor.Localizer["Sys.UploadFailed"]); } } private async Task OnAvatarDelete(UploadFile file) { var idstr = files.Where(x => x.Value == file.OriginFileName || x.Value == file.PrevUrl).Select(x => x.Key).FirstOrDefault(); if (idstr != null) { var rv = await WtmBlazor.Api.CallAPI($"/api/_file/DeletedFile/{idstr}"); files.Remove(idstr); SetDeletedIds(idstr); if (IsMultiple == true) { CurrentValue = (TValue)PropertyHelper.MakeList(typeof(TValue).GetGenericArguments()[0], "FileId", files.Select(x => x.Key).ToArray()); } else { Guid? ng = null; CurrentValue = (TValue)(object)ng; } } return true; } private async Task GetFileData(IBrowserFile file) { using var fileStream = file.OpenReadStream(WtmBlazor.ConfigInfo.FileUploadOptions.UploadLimit); using var memoryStream = new MemoryStream(); await fileStream.CopyToAsync(memoryStream); byte[] rv = memoryStream.ToArray(); memoryStream.Dispose(); fileStream.Dispose(); return rv; } private void SetDeletedIds(string id) { var refpage = PropertyHelper.GetExpressionRootObj(ValueExpression) as BasePage; if (refpage != null) { if (string.IsNullOrEmpty(id) == false) { if (refpage.DeletedFileIds == null) { refpage.DeletedFileIds = new List(); } if (refpage.DeletedFileIds.Contains(id) == false) { refpage.DeletedFileIds.Add(id); } } } } private void ClearDeletedIds() { var refpage = PropertyHelper.GetExpressionRootObj(ValueExpression) as BasePage; if (refpage != null) { refpage.DeletedFileIds = new List(); } } private async Task OnDownload(UploadFile file) { var url = WtmBlazor.GetServerUrl() + file.PrevUrl; await JSRuntime.InvokeVoidAsync("urlFuncs.download", url,null,"GET"); } }