ファイルの保存

コード

package main

import (
    "html/template"
    "io"
    "net/http"
    "os"
)

func main() {
    http.HandleFunc("/", newHandler)
    http.HandleFunc("/create", createHandler)
    http.HandleFunc("/save", saveHandler)
    http.HandleFunc("/save2", saveHandler2)
    http.ListenAndServe(":8080", nil)
}

func newHandler(w http.ResponseWriter, r *http.Request) {
    var templatefile = template.Must(template.ParseFiles("form.html"))
    templatefile.Execute(w, "form.html")
}

func createHandler(w http.ResponseWriter, r *http.Request) {
    reader, err := r.MultipartReader()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    for {
        part, err := reader.NextPart()
        if err == io.EOF {
            break
        }

        //ファイル名がない場合はスキップする
        if part.FileName() == "" {
            continue
        }

        uploadedFile, err := os.Create("" + part.FileName())
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            uploadedFile.Close()
            return
        }

        _, err = io.Copy(uploadedFile, part)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            uploadedFile.Close()
            return
        }
    }
}

// フォームから受け取ったデータをファイルに保存する
func saveHandler(w http.ResponseWriter, r *http.Request) {
    url := "http://placekitten.com/g/640/340"

    response, err := http.Get(url)
    if err != nil {
        panic(err)
    }
    defer response.Body.Close()

    file, err := os.Create("save.jpg")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    io.Copy(file, response.Body)
}

// httpで受け取った画像データをファイルに出力
func saveHandler2(w http.ResponseWriter, r *http.Request) {
    url := "http://placekitten.com/g/640/340"

    res, err := http.Get(url)
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    pin, pout := io.Pipe()

    go func() {
        _, err = io.Copy(pout, res.Body)
        if err != nil {
            panic(err)
        }
        if err != nil {
            pout.CloseWithError(err)
        } else {
            pout.Close()
        }
    }()

    file, err := os.Create("save2.jpg")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    io.Copy(file, pin)
}

参考

https://qiita.com/D3vel0pper/items/ea9f943c5e5d22a13fb6
http://kitak.hatenablog.jp/entry/2014/10/19/175133