使用beego上传多个文件

时间:2014-11-05 05:41:48

标签: beego

如何使用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)
}

可以这样做吗?

2 个答案:

答案 0 :(得分:3)

this.GetFiles

ctrl -f“GetFiles返回多上传文件”

https://github.com/astaxie/beego/blob/master/controller.go
第450行

// GetFiles return multi-upload files
 files, err:=c.Getfiles("myfiles")
    if err != nil {
        http.Error(w, err.Error(), http.StatusNoContent)
        return
    }
 for i, _ := range files {`enter code here
    for each fileheader, get a handle to the actual file
    file, err := files[i].Open()
    defer file.Close()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    //create destination file making sure the path is writeable.
    dst, err := os.Create("upload/" + files[i].Filename)
    defer dst.Close()
    if err != nil {
    enter code here

        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    //copy the uploaded file to the destination file
    if _, err := io.Copy(dst, file); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
 }

答案 1 :(得分:2)

似乎Beego没有方便的方法来上传多个文件。 GetFile()只是从标准库中包装FromFile()。您可能希望使用标准库的读取器功能:r.MultipartReader()。

在这种情况下,我通常会通过调用以下方式从控制器中公开响应式读取器和写入器:

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

现在我能够以标准方式使用net / http包并实现框架外部的解决方案。

快速搜索在Go中上传多个文件会让我感兴趣blog post

为了保护这个答案免受链接腐烂的影响,这是作者的解决方案:

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)
    }
}