Merge branch 'develop' of https://gitee.com/fusenpack/fusenapi into develop
This commit is contained in:
@@ -1,5 +1,24 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"reflect"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
)
|
||||
|
||||
const UploadFileLimitSize = 200 << 20
|
||||
|
||||
// File uploadfile 文件(multipart...)
|
||||
type File struct {
|
||||
Filename string
|
||||
Header map[string][]string
|
||||
Size int64
|
||||
Data []byte
|
||||
}
|
||||
|
||||
// StatusResponse 公司自定义状态码
|
||||
type StatusResponse struct {
|
||||
Code int // 状态码
|
||||
@@ -136,3 +155,75 @@ func (resp *Response) SetStatusAddMessage(sr *StatusResponse, msg string, data .
|
||||
}
|
||||
return newResp
|
||||
}
|
||||
|
||||
var fileType = reflect.TypeOf(File{})
|
||||
|
||||
func RequestFileParse(r *http.Request, req any) error {
|
||||
vreq := reflect.ValueOf(req)
|
||||
if vreq.Kind() != reflect.Ptr {
|
||||
panic("req must &req pass")
|
||||
}
|
||||
|
||||
reqValue := vreq.Elem()
|
||||
reqType := reqValue.Type()
|
||||
for i := 0; i < reqType.NumField(); i++ {
|
||||
if tname, ok := reqType.Field(i).Tag.Lookup("file"); ok {
|
||||
file, fheader, err := r.FormFile(tname)
|
||||
if err != nil {
|
||||
logx.Info("upload file error")
|
||||
return err
|
||||
}
|
||||
|
||||
if fheader.Size > UploadFileLimitSize {
|
||||
err = fmt.Errorf("upload file size over limit %d", UploadFileLimitSize)
|
||||
logx.Info(err)
|
||||
return err
|
||||
}
|
||||
|
||||
data, err := io.ReadAll(file)
|
||||
if err != nil {
|
||||
logx.Info("upload file data error")
|
||||
return err
|
||||
}
|
||||
err = file.Close()
|
||||
if err != nil {
|
||||
logx.Info("file close error")
|
||||
return err
|
||||
}
|
||||
|
||||
field := reqValue.Field(i)
|
||||
|
||||
// aa1:
|
||||
// field.Field(0).Set(fheader.Filename)
|
||||
// field.Field(1).Set( fheader.Header)
|
||||
// field.Field(2).Set( fheader.Size)
|
||||
// field.Field(3).Set( data)
|
||||
|
||||
if field.Kind() == reflect.Ptr {
|
||||
if field.IsNil() {
|
||||
fsfile := reflect.New(field.Type().Elem())
|
||||
fsfile = fsfile.Elem()
|
||||
fsfile.Field(0).Set(reflect.ValueOf(fheader.Filename))
|
||||
fsfile.Field(1).Set(reflect.ValueOf(fheader.Header))
|
||||
fsfile.Field(2).Set(reflect.ValueOf(fheader.Size))
|
||||
fsfile.Field(3).Set(reflect.ValueOf(data))
|
||||
field.Set(fsfile.Addr())
|
||||
} else {
|
||||
field = field.Elem()
|
||||
field.Field(0).Set(reflect.ValueOf(fheader.Filename))
|
||||
field.Field(1).Set(reflect.ValueOf(fheader.Header))
|
||||
field.Field(2).Set(reflect.ValueOf(fheader.Size))
|
||||
field.Field(3).Set(reflect.ValueOf(data))
|
||||
}
|
||||
} else {
|
||||
field.Field(0).Set(reflect.ValueOf(fheader.Filename))
|
||||
field.Field(1).Set(reflect.ValueOf(fheader.Header))
|
||||
field.Field(2).Set(reflect.ValueOf(fheader.Size))
|
||||
field.Field(3).Set(reflect.ValueOf(data))
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user