クライアントからのアクションに対し、
サーバはbase64エンコードした画像を、
そのファイル名とともに
jsonフォーマットでクライアントに返信する、
ということをやっていきます。
まず以下3つのファイルを
同一ディレクトリに置いておきます。
画像は何でもokです。
- file_json.go
- root.html
- sample.jpg
それでは中身を見ていきましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
package main import ( "bufio" "encoding/base64" "encoding/json" "fmt" "io/ioutil" "log" "net/http" "os" ) const name = "sample.jpg" //送信するファイル名 //構造体メンバの名前が小文字だとjson形式に上手く変換出来なかった type Data struct { Fname string `json:"name"` Fdata string `json:"file"` } func jsonHandler(w http.ResponseWriter, r *http.Request) { file, err := os.Open(name) if err != nil { log.Println("[-]Couldn't opne file: ", name) } defer file.Close() /*ファイルをBase64エンコード*/ binary, _ := ioutil.ReadAll(file) base64Data := base64.StdEncoding.EncodeToString(binary) /* Data構造体に入れてJSONエンコード*/ data := &Data{ Fname: name, Fdata: base64Data, } jData, err := json.Marshal(data) if err != nil { log.Println("[-]Failed json encoding: ", err) } fmt.Println(string(jData)) /* 送信 */ w.Header().Set("Content-Type", "application/json") w.Write(jData) /*もしくは*/ //json.NewEncoder(w).Encode(data) fmt.Println("[+]Sent data") } func main() { http.HandleFunc("/json", jsonHandler) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "root.html") }) http.ListenAndServe("localhost:8080", nil) } |
ファイル(画像)をos.Openで読み取ります。
次に、base64エンコードするために、
os.File型をバイナリ(rawデータ)に変換します。
そしたらbase64でエンコードします。
あとはファイル名と一緒に、
json形式でフォーマットするだけです。
送信する際はContent-Typeに
application/jsonを指定して、
w.Writeでクライアントへ送信します。
続いてroot.htmlです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title>サンプル</title> </head> <body> <input type="button" id="btn" value="json形式でファイルを受け取る"> <script> var btn = document.getElementById('btn'); btn.addEventListener('click', () => { fetch('/json') .then(response => response.json()) .then(result => { console.log(result); //console.log(result.name); //console.log(result.file); }) }); </script> </body> </html> |
ボタンが押されたら、
サーバにフェッチします。
その返信をconsole.log()で表示しています。
ちなみに、コメントアウトしてありますが、
「オブジェクト名.キー」とすることで、
欲しい値だけを抽出できます。
実行結果は以下のようになります。
サーバ(go)を起動させて、
localhost:8080に接続します。

ボタンをクリックすると、
以下の結果がコンソールに表示されます。

json形式で受け取れました!
以上です。
最後まで読んでいただきありがとうございました。