gpt4 book ai didi

uno-platform - 如何让 FileUpload 在 WASM for Uno Platform 中工作

转载 作者:行者123 更新时间:2023-12-04 08:06:54 29 4
gpt4 key购买 nike

我正在尝试让 HTML 文件上传控件在 WASM 上运行。到目前为止,我已尝试执行以下操作:

[HtmlElement("input")]
public class FilePickerView : FrameworkElement
{
public FilePickerView()
{
// XAML behavior: a non-null background is required on an element to be "visible to pointers".
// Uno reproduces this behavior, so we must set it here even if we're not using the background.
// Not doing this will lead to a `pointer-events: none` CSS style on the control.
Background = new SolidColorBrush(Colors.Transparent);

this.SetHtmlAttribute("type", "file");
}
}

然后在 View 中:

<wasm:FilePickerView Height="35"  Width="300" x:Name="filePicker" HorizontalAlignment="Left" />

我显示了控件,我可以单击它,它会显示我选择的文件的名称。

在这之后我很迷茫。

我希望能够做两件事:

  1. 在代码隐藏中访问文件路径。
  2. 将文件内容发送到代码隐藏进行处理。

将不胜感激任何关于此的指示。

我已经阅读了文档中的以下页面:

最佳答案

在连接网上的碎片后,我想出了这个方法。但是,它仅适用于最大 500 kb 的文件。

为了启用大文件上传,我必须将 wasm 目标升级到 .net 5 并使用 Uno.Wasm.Bootstrap 和 Uno.WasmBootstrap.DevServer 的开发者版本 (2.0.0-dev.167)(描述了如何升级目标here ).

在此代码中,我启用了仅上传 .wav 音频文件

   private async void uploadBtn_Click(object sender, RoutedEventArgs e)
{
FileSelectedEvent -=OnFileUploadedEvent;
FileSelectedEvent += OnFileUploadedEvent;

WebAssemblyRuntime.InvokeJS(@"
var input = document.createElement('input');
input.type = 'file';
input.accept = '.wav';
input.onchange = e => {
var file = e.target.files[0];
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = readerEvent => {
//this is the binary uploaded content
var content = readerEvent.target.result;
//invoke C# method to get audio binary data
var selectFile = Module.mono_bind_static_method(" + "\"[MyApp.Wasm] MyApp.Shared.MyPage:SelectFile\""+@");
selectFile(content);

};
};
input.click(); "
);
}
public static void SelectFile(string fileAsDataUrl) => FileSelectedEvent?.Invoke(null, new FileSelectedEventHandlerArgs(fileAsDataUrl));

private void OnFileUploadedEvent(object sender, FileSelectedEventHandlerArgs e)
{
FileSelectedEvent -= OnFileUploadedEvent;
var base64Data = Regex.Match(e.FileAsDataUrl, @"data:audio/(?<type>.+?),(?<data>.+)").Groups["data"].Value;
var binData = Convert.FromBase64String(base64Data); //this is the data I want
Console.Out.WriteLine("I got binary data of uploaded file");
}

private static event FileSelectedEventHandler FileSelectedEvent;

private delegate void FileSelectedEventHandler(object sender, FileSelectedEventHandlerArgs args);

private class FileSelectedEventHandlerArgs
{
public string FileAsDataUrl { get; }
public FileSelectedEventHandlerArgs(string fileAsDataUrl) => FileAsDataUrl = fileAsDataUrl;

}

此外,我无法同时使用 SQLite 运行它。可悲的是,我仍然没有弄清楚原因。

来源:

编辑:显然,适用于 .NET 5/6 的 SQLite 仍在进行中,有些包需要更改。

关于uno-platform - 如何让 FileUpload 在 WASM for Uno Platform 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66180638/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com