3

beegoで複数のファイルをアップロードするには? GetFile メソッドは、最初のファイル名のみを返します。

html:

<form action="/post/save" method="POST" enctype="multipart/form-data">
    <input type="file" name="images" multiple>
</form>

コントローラーで:

file, header, err := this.GetFile("images")
if err != nil {
    log.Println("error", err)
} else {
    log.Println("filename", header.Filename)
}

このようにすることは可能ですか?

4

2 に答える 2

2

複数のファイルをアップロードするための便利な方法が Beego にあるようには見えません。GetFile() は、標準ライブラリから FromFile() をラップするだけです。標準ライブラリのリーダー関数 r.MultipartReader() を使用することをお勧めします。

このような状況では、通常、次のように呼び出して、コントローラーからの応答リーダーとライターを公開します。

w = this.Ctx.ResponseWriter
r = this.Ctx.ResponseReader

これで、net/http パッケージを標準的な方法で使用し、フレームワークの外部にソリューションを実装できるようになりました。

Go で複数のファイルをアップロードする方法を簡単に検索すると、役に立つブログ投稿にたどり着きます。

この回答をリンクの腐敗から保護するために、著者の解決策は次のとおりです。

func uploadHandler(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    //GET displays the upload form.
    case "GET":
        display(w, "upload", nil)

    //POST takes the uploaded file(s) and saves it to disk.
    case "POST":
        //get the multipart reader for the request.
        reader, err := r.MultipartReader()

        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

        //copy each part to destination.
        for {
            part, err := reader.NextPart()
            if err == io.EOF {
                break
            }

            //if part.FileName() is empty, skip this iteration.
            if part.FileName() == "" {
                continue
            }
            dst, err := os.Create("/home/sanat/" + part.FileName())
            defer dst.Close()

            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }

            if _, err := io.Copy(dst, part); err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
        }
        //display success message.
        display(w, "upload", "Upload successful.")
    default:
        w.WriteHeader(http.StatusMethodNotAllowed)
    }
}
于 2015-02-05T05:28:06.457 に答える