ディレクトリ構成
imgフォルダにアップロードしたファイルが保存されます。
./
├ index.html
├ main.go
├ img/
└ ここにファイルが保存される
└ ここにファイルが保存される
└ ここにファイルが保存される
.
.
.
.
コード
main.go
main.go
package main
import (
"html/template"
"io"
"log"
"net/http"
"os"
)
func upload(w http.ResponseWriter, r *http.Request) {
//メソッドをPOSTのみ許可
if r.Method != "POST" {
log.Fatal("許可されていないメソッド")
}
//formから送信されたファイルを解析
file, fileHeader, err := r.FormFile("image")
if err != nil {
log.Fatal("ファイルのアップロード失敗")
}
//アップロードされたファイル名を取得
uploadedFileName := fileHeader.Filename
//アップロードされたファイルを置くパスを設定
imagePath := "img/" + uploadedFileName
//imagePathにアップロードされたファイルを保存
saveImage, err := os.Create(imagePath)
if err != nil {
log.Fatal("ファイルの確保失敗")
}
//保存用ファイルにアップロードされたファイルを書き込む
_, err = io.Copy(saveImage, file)
if err != nil {
log.Fatal("アップロードしたファイルの書き込み失敗")
}
//saveImageとfileを最後に閉じる
defer saveImage.Close()
defer file.Close()
//もう1周
http.Redirect(w, r, "/", 302)
}
func index(w http.ResponseWriter, r *http.Request) {
tmp := template.Must(template.ParseFiles("index.html"))
if err := tmp.Execute(w, nil); err != nil {
log.Fatal(err)
}
}
func main() {
http.HandleFunc("/upload", upload)
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8000", nil))
}
index.html
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ファイルアップロード</title>
</head>
<body>
<div class="container">
<h1>ファイルアップロード</h1>
<form method="post" action="/upload" enctype="multipart/form-data">
<input type="file" name="image" multiple="multiple" />
<input type="submit" name="submit" value="アップロード" />
</form>
</div>
</body>
</html>
外観
できなかったこと
テンプレートで <img src="{{.}}/> にimagePathを渡してみたが表示されなかったです。vscodeを右クリックした時に出てくるPHPサーバーってやつではみれました。原因不明ですが、アップロードした画像の表示は諦めました。
追記 githubに置いておきました。https://github.com/souhub/go-file-uploader