Merge pull request #4437 from AllenX2018/fix-issue-4411

Fix issue #4411
This commit is contained in:
Ming Deng 2021-03-14 22:09:20 +08:00 committed by GitHub
commit 88c522935f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -28,11 +28,11 @@ import (
"reflect" "reflect"
"strconv" "strconv"
"strings" "strings"
"sync"
"github.com/beego/beego/v2/server/web/session"
"github.com/beego/beego/v2/server/web/context" "github.com/beego/beego/v2/server/web/context"
"github.com/beego/beego/v2/server/web/context/param" "github.com/beego/beego/v2/server/web/context/param"
"github.com/beego/beego/v2/server/web/session"
) )
var ( var (
@ -40,8 +40,21 @@ var (
ErrAbort = errors.New("user stop run") ErrAbort = errors.New("user stop run")
// GlobalControllerRouter store comments with controller. pkgpath+controller:comments // GlobalControllerRouter store comments with controller. pkgpath+controller:comments
GlobalControllerRouter = make(map[string][]ControllerComments) GlobalControllerRouter = make(map[string][]ControllerComments)
copyBufferPool sync.Pool
) )
const (
bytePerKb = 1024
copyBufferKb = 32
filePerm = 0666
)
func init() {
copyBufferPool.New = func() interface{} {
return make([]byte, bytePerKb*copyBufferKb)
}
}
// ControllerFilter store the filter for controller // ControllerFilter store the filter for controller
type ControllerFilter struct { type ControllerFilter struct {
Pattern string Pattern string
@ -605,19 +618,31 @@ func (c *Controller) GetFiles(key string) ([]*multipart.FileHeader, error) {
// SaveToFile saves uploaded file to new path. // SaveToFile saves uploaded file to new path.
// it only operates the first one of mutil-upload form file field. // it only operates the first one of mutil-upload form file field.
func (c *Controller) SaveToFile(fromfile, tofile string) error { func (c *Controller) SaveToFile(fromFile, toFile string) error {
file, _, err := c.Ctx.Request.FormFile(fromfile) buf := copyBufferPool.Get().([]byte)
defer copyBufferPool.Put(buf)
return c.SaveToFileWithBuffer(fromFile, toFile, buf)
}
type onlyWriter struct {
io.Writer
}
func (c *Controller) SaveToFileWithBuffer(fromFile string, toFile string, buf []byte) error {
src, _, err := c.Ctx.Request.FormFile(fromFile)
if err != nil { if err != nil {
return err return err
} }
defer file.Close() defer src.Close()
f, err := os.OpenFile(tofile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
dst, err := os.OpenFile(toFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, filePerm)
if err != nil { if err != nil {
return err return err
} }
defer f.Close() defer dst.Close()
io.Copy(f, file)
return nil _, err = io.CopyBuffer(onlyWriter{dst}, src, buf)
return err
} }
// StartSession starts session and load old session data info this controller. // StartSession starts session and load old session data info this controller.