解决 beego上传文件时 报http: no such file 错误

18 篇文章 1 订阅
13 篇文章 0 订阅
文章讲述了在使用beego框架进行文件上传时,错误地使用`SaveToFile`方法导致的`http:nosuchfile`报错,以及正确的使用`FormFile`获取上传文件信息并保存的方法。作者还提供了相关的源码解析。
摘要由CSDN通过智能技术生成

上传时文件上传失败:
关键报错的代码:

	//获得文件名
	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()
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于问题中提到的错误信息 "No such file or directory",它通常表示在所指定的路径下找不到该文件或目录。根据引用,该错误可能是由于缺少了 "corecrt.h" 文件,而引用中的错误则指出找不到 "/usr/bin/yum" 文件。下面是针对这两个错误解决方法: 1. 对于 "corecrt.h" 文件缺失的问题,该文件是属于 Windows 平台上的 C++ 运行库。如果您在 Linux 环境下遇到这个错误,可能是因为您正在尝试在 Linux 上使用一个只适用于 Windows 的代码。请确保您正在使用正确的库文件,并根据您的操作系统选择正确的库文件。 2. 关于 "yum" 命令找不到的问题,根据引用中所提到的命令 "yum remove yum",该命令被错误地用于删除 "yum" 这个软件包。然而,这导致了系统无法执行 "yum" 命令,因为该命令已经被删除了。要修复这个问题,您可以尝试以下步骤: - 首先,确保您的系统中有一个有效的包管理器,如 "apt"。 - 运行命令 "sudo apt-get install yum",这将重新安装 "yum" 软件包。 - 如果您的系统不支持 "yum",您可以尝试使用系统默认的包管理器来安装软件包。 对于引用中提到的问题 "c: No such file or directory -r: No such file or directory",这是一个错误的命令行输入。在 Linux 系统中,命令行参数以空格分隔,而不是使用连字符 ("-") 连接。如果您想运行一个命令,您应该确保命令参数正确分隔,并使用正确的命令语法。如果您可以提供更多上下文信息或具体的命令行输入,我可以更进一步地帮助您解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeMartain

祝:生活蒸蒸日上!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值