From 662ee2213408dd7dfee49e29190f9588f5e32889 Mon Sep 17 00:00:00 2001 From: AllenX2018 Date: Mon, 11 Jan 2021 16:24:06 +0800 Subject: [PATCH 1/4] modify variable name --- server/web/controller.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/web/controller.go b/server/web/controller.go index 5983cfbd..69ad64da 100644 --- a/server/web/controller.go +++ b/server/web/controller.go @@ -605,13 +605,13 @@ func (c *Controller) GetFiles(key string) ([]*multipart.FileHeader, error) { // SaveToFile saves uploaded file to new path. // it only operates the first one of mutil-upload form file field. -func (c *Controller) SaveToFile(fromfile, tofile string) error { - file, _, err := c.Ctx.Request.FormFile(fromfile) +func (c *Controller) SaveToFile(fromFile, toFile string) error { + file, _, err := c.Ctx.Request.FormFile(fromFile) if err != nil { return err } defer file.Close() - f, err := os.OpenFile(tofile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + f, err := os.OpenFile(toFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { return err } From 06292a0ecafc83ac06a6b285297548702c96b85e Mon Sep 17 00:00:00 2001 From: AllenX2018 Date: Mon, 11 Jan 2021 16:27:52 +0800 Subject: [PATCH 2/4] add error handle --- server/web/controller.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/web/controller.go b/server/web/controller.go index 69ad64da..ef6ba27b 100644 --- a/server/web/controller.go +++ b/server/web/controller.go @@ -611,13 +611,15 @@ func (c *Controller) SaveToFile(fromFile, toFile string) error { return err } defer file.Close() + f, err := os.OpenFile(toFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { return err } defer f.Close() - io.Copy(f, file) - return nil + + _, err = io.Copy(f, file) + return err } // StartSession starts session and load old session data info this controller. From 4c523830a7a142c5c7392ad13940989bbc33c7d3 Mon Sep 17 00:00:00 2001 From: AllenX2018 Date: Mon, 11 Jan 2021 16:41:48 +0800 Subject: [PATCH 3/4] add SaveToFileWithBuffer --- server/web/controller.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/server/web/controller.go b/server/web/controller.go index ef6ba27b..18a7b002 100644 --- a/server/web/controller.go +++ b/server/web/controller.go @@ -29,10 +29,9 @@ import ( "strconv" "strings" - "github.com/beego/beego/v2/server/web/session" - "github.com/beego/beego/v2/server/web/context" "github.com/beego/beego/v2/server/web/context/param" + "github.com/beego/beego/v2/server/web/session" ) var ( @@ -622,6 +621,26 @@ func (c *Controller) SaveToFile(fromFile, toFile string) error { return err } +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 { + return err + } + defer src.Close() + + dst, err := os.OpenFile(toFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return err + } + + _, err = io.CopyBuffer(onlyWriter{dst}, src, buf) + return err +} + // StartSession starts session and load old session data info this controller. func (c *Controller) StartSession() session.Store { if c.CruSession == nil { From 58b3f37e9eeaadb58485f4e6780ef72c8d2e7c0c Mon Sep 17 00:00:00 2001 From: AllenX2018 Date: Mon, 11 Jan 2021 16:56:12 +0800 Subject: [PATCH 4/4] add object pool for SaveToFile --- server/web/controller.go | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/server/web/controller.go b/server/web/controller.go index 18a7b002..62590441 100644 --- a/server/web/controller.go +++ b/server/web/controller.go @@ -28,6 +28,7 @@ import ( "reflect" "strconv" "strings" + "sync" "github.com/beego/beego/v2/server/web/context" "github.com/beego/beego/v2/server/web/context/param" @@ -39,8 +40,21 @@ var ( ErrAbort = errors.New("user stop run") // GlobalControllerRouter store comments with controller. pkgpath+controller:comments 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 type ControllerFilter struct { Pattern string @@ -605,20 +619,9 @@ func (c *Controller) GetFiles(key string) ([]*multipart.FileHeader, error) { // SaveToFile saves uploaded file to new path. // it only operates the first one of mutil-upload form file field. func (c *Controller) SaveToFile(fromFile, toFile string) error { - file, _, err := c.Ctx.Request.FormFile(fromFile) - if err != nil { - return err - } - defer file.Close() - - f, err := os.OpenFile(toFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - return err - } - defer f.Close() - - _, err = io.Copy(f, file) - return err + buf := copyBufferPool.Get().([]byte) + defer copyBufferPool.Put(buf) + return c.SaveToFileWithBuffer(fromFile, toFile, buf) } type onlyWriter struct { @@ -632,10 +635,11 @@ func (c *Controller) SaveToFileWithBuffer(fromFile string, toFile string, buf [] } defer src.Close() - dst, 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 { return err } + defer dst.Close() _, err = io.CopyBuffer(onlyWriter{dst}, src, buf) return err