Chapter 13無料公開

net/http 5 <データ形式>

enctype

enctype属性は、フォームの送信データのMIMEタイプを設定するための属性です。MIMEタイプというのは、データ形式を表していてファイルでいうところの拡張子の役割のようなものです。enctypeにMIMEタイプを設定してデータ形式を指定することができます。
まずはgo文を次のようにします。

main.go
package main

import (
	"html/template"
	"log"
	"net/http"
)

var tpl *template.Template

func init() {
	tpl = template.Must(template.ParseGlob("templates/*"))
}

type person struct {
	Pfname string
	Plname string
	Pcheck bool
}

func main() {
	http.HandleFunc("/", foo)
	http.Handle("/favicon.ico", http.NotFoundHandler())
	http.ListenAndServe("localhost:8080", nil)
}

func foo(w http.ResponseWriter, req *http.Request) {

	bs := make([]byte, req.ContentLength) // byte型スライスの空箱を作成
	req.Body.Read(bs)
	body := string(bs)

	err := tpl.ExecuteTemplate(w, "index.gohtml", body)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError) // 500
		log.Fatalln(err)
	}
}

enctype デフォルト

これまで指定してきていませんでしたが、デフォルトは「application/x-www-form-urlencoded」です。ネット検索などでよくアドレスバーで見るあれです。

index.gohtml
{{template "header"}}

<form method="POST" enctype="application/x-www-form-urlencoded">
    <label for="firstName">First Name</label>
    <input type="text" id="firstName" name="first">
    <br>
    <label for="lastName">Last Name</label>
    <input type="text" id="lastName" name="last">
    <br>
    <label for="chk">check</label>
    <input type="checkbox" id="chk" name="check">
    <br>
    <input type="submit">
</form>

<br>

{{if .}}
<h1>BODY: {{.}}</h1>
{{end}}

{{template "footer"}}

出力結果は、

ちなみに日本語の全角文字を入れると、次のように文字化けします。

enctype マルチパート

type属性の値に「file」が設定されたinput要素をフォームに用いるときにはマルチパートを指定する必要があります。とりあえず、中身は次のような文字列になります。

index.gohtml 抜粋
<!--<form method="POST" enctype="application/x-www-form-urlencoded">
-->
<form method="POST" enctype="multipart/form-data">

enctype テキスト

間が&でつながれていません。

index.gohtml 抜粋
<!--<form method="POST" enctype="multipart/form-data">-->
<form method="POST" enctype="text/plain">