在Buffalo中上传文件需先解析multipart/form-data请求体,再遍历文件头、打开流并流式写入磁盘或直传腾讯云COS;须校验enctype、显式关闭句柄、避免内存溢出。

在Buffalo框架中接收并保存用户上传的文件,需正确解析multipart/form-data请求体、打开文件句柄、读取流并写入目标路径,否则会因未处理表单或未关闭句柄导致上传失败或磁盘泄漏。
获取上传的文件对象
调用c.Request().MultipartForm解析请求体,这是处理文件上传的第一步。Buffalo不会自动解析multipart数据,跳过这步将收不到任何文件字段。
检查err是否为nil,若返回http.ErrNotMultipart,说明前端未设置enctype="multipart/form-data",此时直接返回400错误。
遍历并打开每个上传文件
从form.File["file"]中取出文件头列表,注意键名必须与HTML表单中<input type="file" name="file">的name属性严格一致,大小写敏感。
对每个fh调用fh.Open()获得可读流。这一步必须做,否则无法读取内容;但fh.Open()返回的f必须在后续显式defer f.Close(),否则连接保持打开状态,可能耗尽系统文件描述符。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
保存文件到本地磁盘
方法一:使用ioutil.WriteFile一次性写入(适合小文件)
先用io.ReadAll(f)读取全部内容到内存,再调用ioutil.WriteFile("/path/to/save/"+fh.Filename, data, 0644)。该方式简单,但【文件超过50MB时极易触发OOM】,不适用于生产环境大文件上传。
方法二:流式写入(推荐)
创建目标文件:dst, err := os.Create("/upload/" + fh.Filename);
用io.Copy(dst, f)边读边写;
最后dst.Close()。这种方式内存占用恒定,支持GB级文件,且能配合io.LimitReader做大小限制。
对接腾讯云COS存储
第一步:初始化COS客户端
使用cos.NewClient传入&cos.BaseURL{BucketURL: "https://my-bucket-1251234567.cos.ap-shanghai.myqcloud.com"}和&http.Client{}。注意BucketURL必须带协议、地域、后缀,缺一不可,否则签名失败返回403。
第二步:上传文件流到COS
调用client.Object.Put,传入context.Background()、fh.Filename(即ObjectKey)、f(原始文件流)和nil(options)。这一步无需先把文件落地,直接流式上传,节省磁盘IO。
第三步:校验响应
检查err是否为nil,非空则说明上传中断或鉴权失败;成功时COS返回200 OK且Response.Header.Get("ETag")含合法MD5值,可用于完整性校验。

















