Merge pull request #4437 from AllenX2018/fix-issue-4411
Fix issue #4411
This commit is contained in:
commit
88c522935f
@ -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.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user