FormFile()接收文件问题

type Sizer interface {
    Size() int64
}

//上传处理函数
func GetFile(w http.ResponseWriter, r *http.Request){
    file, handler, err := r.FormFile("file")
    if err != nil {
        msg := "获取上传文件错误:" + err.Error()
        fmt.Fprintf(w, msg)
        return
    }
    defer file.Close()

    if fileSizer, ok := file.(Sizer); ok {
        fileSize := fileSizer.Size() / (1024*1024)
        fmt.Println("上传文件的大小为: %d",fileSize, handler.Filename)
        if fileSize > 100 {
            msg := "获取上传文件错误:文件大小超出100M"
            fmt.Fprintf(w, msg)
            return
        }
    } else {
        msg := "获取上传文件错误:无法读取文件大小"
        fmt.Fprintf(w, msg)
        return
    }

    fmt.Fprintf(w, "ok")
}

问题:

  1. 上传大文件比如115M时,file.(Sizer)失败,无法获取上传的文件大小

  2. 内存随上传文件的大小而增加,即执行完GetFile()后没有释放内存

请问要如何解决这两个问题?

共 10 个回复


chenhao

源码里显示默认是32M,我发现上传34M的文件也是可以读取到大小的,这是怎么回事?还有要如何判断上传的文件大小是否超出了缓冲区,通过前端限制吗?

# 1

chenhao

还有我设置r.ParseMultipartForm(128 << 20)后,上传115M文件还是无法读取到文件的大小.

# 2

chenhao

是不是用了beego的原因?

# 3

jimmykuu

你写个原生的测试下好了。

# 4

chenhao

经测试确实是beego.MaxMemory默认为64M的原因,导致在GetFile中设置 this.Ctx.Request.ParseMultipartForm(128 << 20) 无效.

# 5

shenjiayu

不是应该default, 然后用户设置覆盖的么~有点不是很人性化~

# 6

chenhao

golang文档显示ParseMultipartForm仅有第一次调用有效. 还是r.FormFile后内存不能马上释放的问题较大

# 7

chenhao

同样问题:https://github.com/astaxie/beego/issues/42

# 8

chenhao

官方issue:https://code.google.com/p/go/issues/detail?id=8491

# 9