前回作った雛形をベースにWebAssemblyで画像処理サービスを作りたいと思い、とりあえずinputタグでアップロードしたファイルのサイズを取得してconsoleに出してみました。
書いたコード
index.html
<!DOCTYPE html>
<html>
<head>
<title>WebAssembly File Size</title>
</head>
<body>
<h1>WebAssembly File Size</h1>
<input type="file" id="fileInput" accept="image/*">
<script src="/js/wasm_exec.js"></script>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch("/wasm/main.wasm"), go.importObject)
.then(result => {
go.run(result.instance);
const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function(event) {
const file = event.target.files[0];
if (file) {
getFileSize(file);
}
});
})
.catch(err => {
console.error(err);
});
</script>
</body>
</html>
main.go
package main
import (
"fmt"
"syscall/js"
)
func getFileSize(this js.Value, args []js.Value) interface{} {
if len(args) != 1 {
return nil
}
file := args[0]
size := file.Get("size").Int()
fmt.Printf("Uploaded File Size: %d bytes\n", size)
return nil
}
func main() {
c := make(chan struct{}, 0)
js.Global().Set("getFileSize", js.FuncOf(getFileSize))
<-c
}
Goでjs.Valueと[]js.Valueを引数に持ちinterface{}(any)を返す関数を作る。ここはお決まりらしい syscall/jsパッケージのjs.Global()でGoの関数をjs側に登録できる。
同じような仕組みでGoとJSで変数やDOMもやりとりできるっぽい