上传时文件上传失败:
关键报错的代码:
//获得文件名
filename := header.Filename
//上传文件
//注意,这里SaveToFile参数要跟传入的文件名的key一致,否则就会报http: no such file
err = f.SaveToFile(filename, "./static/file/"+filename)
if err != nil {
logs.Error(err)
}
上传文件时获取到文件名,但是这样用SaveToFile的方式是错误的:
正确的方式是:
//获得上传文件的信息
file, header, err := f.GetFile("filename")
//上传文件
//注意,这里SaveToFile参数要跟传入的文件名的key一致,否则就会报http: no such file
err = f.SaveToFile("filename", "./static/file/"+filename)
if err != nil {
logs.Error(err)
}
两者的区别就在于:
SaveToFile接受的是form表单里文件所在的 key ,看一下源码就知道了:
追溯源码:
// FormFile returns the first file for the provided form key. //这里表明,从key获取文件
// FormFile calls ParseMultipartForm and ParseForm if necessary.
func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) {
if r.MultipartForm == multipartByReader {
return nil, nil, errors.New("http: multipart handled by MultipartReader")
}
if r.MultipartForm == nil {
err := r.ParseMultipartForm(defaultMaxMemory)
if err != nil {
return nil, nil, err
}
}
if r.MultipartForm != nil && r.MultipartForm.File != nil {
if fhs := r.MultipartForm.File[key]; len(fhs) > 0 {
f, err := fhs[0].Open()
return f, fhs[0], err
}
}
return nil, nil, ErrMissingFile
}
下面是完整的代码:
package models
import "github.com/beego/beego/v2/adapter/orm"
type File struct {
Id int64 `json:"id"`
Name string `json:"name"`
Addr string `json:"addr"`
Size int64 `json:"size"`
Cid int64 `json:"cid"`
}
func init() {
orm.RegisterModel(new(File))
}
func AddFile(f *File) (int64, error) {
newOrm := orm.NewOrm()
return newOrm.InsertOrUpdate(f)
}
package controllers
import (
"github.com/beego/beego/v2/core/logs"
beego "github.com/beego/beego/v2/server/web"
"hello/coom"
"hello/models"
)
type FileController struct {
beego.Controller
}
/*
*
上传文件
*/
func (f *FileController) UploadFile() {
//获得上传文件的信息
file, header, err := f.GetFile("filename")
if err != nil {
logs.Error(err)
}
defer file.Close()
//获得文件名
filename := header.Filename
//上传文件
//注意,这里SaveToFile参数要跟传入的文件名的key一致,否则就会报http: no such file
err = f.SaveToFile(filename, "./static/file/"+filename)
if err != nil {
logs.Error(err)
}
//获取文件信息
var fileInfo models.File
cid, _ := f.GetInt64("cid")
fid, _ := f.GetInt64("id")
fileInfo = models.File{
Id: fid,
Name: filename,
Addr: "./" + filename,
Size: header.Size,
Cid: cid,
}
//插入数据库 --先不考虑事务
_, err = models.AddFile(&fileInfo)
if err != nil {
logs.Error(err)
}
if err != nil {
f.Data["json"] = &coom.Response{
Code: 400,
Msg: "文件上传失败",
Data: nil,
Success: false,
}
f.ServeJSON()
} else {
f.Data["json"] = &coom.Response{
Code: 200,
Msg: "文件上传成功",
Data: nil,
Success: true,
}
f.ServeJSON()
}
}