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

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

ただいまの
回答率

90.75%

  • Go

    456questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 387

UekiKouji

score 100

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>

イメージ説明

イメージ説明

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

package main

import (
    "fmt"
    "html/template"
    "io/ioutil"
    "net/http"
)

func process(w http.ResponseWriter, r *http.Request) {
    // POST 以外は許可しない
    if r.Method != http.MethodPost {
        http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
        return
    }
    // アップロードサイズを 1024 バイトまでとする
    err := r.ParseMultipartForm(1024)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    // uploaded を参照する
    items, ok := r.MultipartForm.File["uploaded"]
    if !ok || len(items) == 0 {
        // 期待しないアップロードはエラー
        http.Error(w, "No upload files", http.StatusBadRequest)
        return
    }
    file, err := items[0].Open()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer file.Close()

    data, err := ioutil.ReadAll(file)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    fmt.Fprintln(w, string(data))
}

func client(w http.ResponseWriter, r *http.Request) {
    t, err := template.ParseFiles("client.html")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    t.Execute(w, nil)
}

func main() {
    server := http.Server{
        Addr: "127.0.0.1:9000",
    }
    http.HandleFunc("/process", process)
    http.HandleFunc("/client", client)
    server.ListenAndServe()
}


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/14 06:52

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

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Go

    456questions

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