3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Go】ファイルアップロード

Posted at

#技術書で勉強した内容をまとめたい
のでちょっとずつ投稿していこうと思います。
みなさんGoの学習は捗っているでしょうか?僕は全然です(爆)
あーいつになったらGoのエンジニアになれんだろー、って毎日思いながらjavaやってます笑。

というかたまにGoって初心者にもオススメの言語!みたいな記事見るんですけど、本当にそうなんですかね?
ほんとにまっさらな初心者でGoやってる人身近にいないのでわからないのですが、普通に簡単な言語じゃないので、自分はあまり初心者にはオススメできない。それは自分がちゃんと理解できてないからなんですが。

確かに動的型付け言語なのにシンプルに記述できて環境構築等の煩わしい作業が少ないという点では確かに学びやすさというのははわからなくもないのですが。
最初にC言語やjavaで挫折している経験があるからか、初心者にはもっと優しい言語でよいというのが自分の考え。

自分の勝手なイメージではC言語の経験者は余裕、javaの経験者もまぁ、勉強しながらなら大丈夫(ちなみにこの中に自分は入っていない)。それ以外の人、ポインタ?なにそれ美味しいの?から始まる。

#本題
読んでいる技術書はこちら
Goプログラミング実践入門

#Goでのファイルアップロードについて
今回はGo言語でのファイルアップロードの実装を見ていきたいと思います。
実は他の言語でのファイルアップロードをやったことがないので、Goではじめてファイルアップロードをやることになります。再度言うが一応javaのエンジニア(を名乗っている)。
fileをクライアントから送信して、サーバー側で受け取ったら、中身をレスポンスに表示するという内容。

index.html
<html>
--略--
 <body>
  <form action="http://localhost:8080/process?hello=qiita&article=123" method="post" enctype="multipart/form-data">
   <input type="text" name="hello" value="huji"/>
   <input type="text" name="post" value="456"/>
   <input type="file" name="uploaded">
   <input type="submit">
  </form>
 <body>
</html>

ファイルを受信するにはハンドラ関数を以下の通り設定
ちなみに1024は最大バイト数。

server.go
func process(w http.ResponseWriter, r *http.Request){
  r.PrseMultipartForm(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))
    }
  }
}

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

実はこのprocess関数、下の書きかたで大丈夫。
FormFileメソッドでfileとfileHeaderを同時に取得できるからこれだけでok。
今回はfileしか使わないが、一発でfileを取得できるのはすばらしい。

server.go
func process(w http.ResponseWriter, r *http.Request){
  file,_,err := r.FormFile("uploaded")
  if err == nil {
    data, err := ioutil.ReadAll(file)
    if err == nil{
      fmt.Fprintln(w, string(data))
    }
  }
}

とまぁ、今回はこんな感じです。
なんかツッコミあったら是非是非お待ちしております。

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?