为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Go 从磁盘读取文件并将其传递给 WebAssembly?

如何使用 Go 从磁盘读取文件并将其传递给 WebAssembly?

Go
MYYA 2023-06-01 17:18:18
具体<input type="file">在Go中如何与这个函数对接?我知道有“syscall/js”包,但我没有找到任何文件读取的例子。func parseCSVFile(filePath string) []LabelWithFeatures {    fileContent, _ := ioutil.ReadFile(filePath)    lines := bytes.Split(fileContent, newline)    numRows := len(lines)    labelsWithFeatures := make([]LabelWithFeatures, numRows-2)    for i, line := range lines {        // skip headers        if i == 0 || i == numRows-1 {            continue        }        labelsWithFeatures[i-1] = NewLabelWithFeatures(bytes.Split(line, comma))    }    return labelsWithFeatures}
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

多年来我一直想要一个满意的答案,前几天晚上终于想通了。


您基本上可以将整个事情归结为:


    fileInput := document.Call("getElementById", "fileInput")


    fileInput.Set("oninput", js.FuncOf(func(v js.Value, x []js.Value) any {

        fileInput.Get("files").Call("item", 0).Call("arrayBuffer").Call("then", js.FuncOf(func(v js.Value, x []js.Value) any {

            data := js.Global().Get("Uint8Array").New(x[0])

            dst := make([]byte, data.Get("length").Int())

            js.CopyBytesToGo(dst, data)

            // the data from the file is in dst - do what you want with it

            


            return nil

        }))


        return nil

    }))

查看完整回答
反对 回复 2023-06-01
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

您无法真正在浏览器中访问文件系统。wasm_exec.js用于在浏览器中执行 Go webassembly,它模拟了一些文件系统功能,但我认为它对你不是很有用,

文件读取方法甚至默认返回错误。

你提到了<input type="file">。您可以从上传的文件中获取字节:Getting byte array through input type = file。然后,您可以将这些字节传递给 Golang wasm 运行时。

在您的 Go 代码中定义一个全局系统调用/js 回调,并从浏览器调用它以将字节向下传递到 Go 运行时。

我会寻找关于如何在 Go 运行时中定义回调的博文。还要注意 go 1.11 和 1.12 之间的变化,api 有重大变化。


查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 281 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信