質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

2888閲覧

golangでpostできない理由を教えてください

UekiKouji

総合スコア121

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2017/09/13 04:41

goでpostするformを作成しています。その中で、htmlは表示されるのですが、送信した後の処理がうまく行きません。どのように変更すれば、良いかわからないので、よろしくお願いします。ソースが綺麗ではないのですが、初めて使う言語なので、よろしくお願いします。

server.go

package main import ( "fmt" "io/ioutil" "net/http" "html/template" ) func process(w http.ResponseWriter, r *http.Request) { r.ParseMultipartForm(1024) fileHeader := r.MultipartForm.File["uploaded"][0] file, err := fileHeader.Open() if err == nil { data, err := ioutil.ReadAll(file) if err == nil { fmt.Fprintln(w, string(data)) } else { http.Error(w, err.Error(), http.StatusInternalServerError) return } } } func client(w http.ResponseWriter, r *http.Request) { err := template.ParseFiles("client.html") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } func main() { server := http.Server{ Addr: "127.0.0.1:9000", } http.HandleFunc("/process", process) http.HandleFunc("/client", client) server.ListenAndServe() }

client.html

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Go Web Programming</title> </head> <body> <form action="http://localhost:9000/process?hello=world&thread=123" method="post" enctype="multipart/form-data"> <input type="text" name="hello" value="sau sheong"/> <input type="text" name="post" value="456"/> <input type="file" name="uploaded"> <input type="submit"> </form> </body> </html>

イメージ説明

イメージ説明

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

サーバ側で例外が発生していると思います。エラー処理が抜けていますので、漏れなくチェックして下さい。
以下のコードで動くのは確認しました。

go

1package main 2 3import ( 4 "fmt" 5 "html/template" 6 "io/ioutil" 7 "net/http" 8) 9 10func process(w http.ResponseWriter, r *http.Request) { 11 // POST 以外は許可しない 12 if r.Method != http.MethodPost { 13 http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) 14 return 15 } 16 // アップロードサイズを 1024 バイトまでとする 17 err := r.ParseMultipartForm(1024) 18 if err != nil { 19 http.Error(w, err.Error(), http.StatusInternalServerError) 20 return 21 } 22 // uploaded を参照する 23 items, ok := r.MultipartForm.File["uploaded"] 24 if !ok || len(items) == 0 { 25 // 期待しないアップロードはエラー 26 http.Error(w, "No upload files", http.StatusBadRequest) 27 return 28 } 29 file, err := items[0].Open() 30 if err != nil { 31 http.Error(w, err.Error(), http.StatusInternalServerError) 32 return 33 } 34 defer file.Close() 35 36 data, err := ioutil.ReadAll(file) 37 if err != nil { 38 http.Error(w, err.Error(), http.StatusInternalServerError) 39 return 40 } 41 fmt.Fprintln(w, string(data)) 42} 43 44func client(w http.ResponseWriter, r *http.Request) { 45 t, err := template.ParseFiles("client.html") 46 if err != nil { 47 http.Error(w, err.Error(), http.StatusInternalServerError) 48 return 49 } 50 t.Execute(w, nil) 51} 52 53func main() { 54 server := http.Server{ 55 Addr: "127.0.0.1:9000", 56 } 57 http.HandleFunc("/process", process) 58 http.HandleFunc("/client", client) 59 server.ListenAndServe() 60}

なお、提示されておられるコードではコンパイル出来ませんでした。

投稿2017/09/13 06:47

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UekiKouji

2017/09/13 21:52

ありがとうございます。確かにコンパイルできませんでした。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問