当前位置: 首页 > article >正文

使用mime/multipart上传文件报错:multipart: NextPart: EOF

go版本: go1.22.2

server文件:

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"time"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("hello world"))
	})

	http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
		r.ParseMultipartForm(10 << 20) // 限制上传文件最大10M

		f, fh, err := r.FormFile("hello")
		fmt.Println("r.FormFile f: ", f)
		fmt.Println("r.FormFile fh: ", fh)
		fmt.Println("r.FormFile err: ", err)

		if err != nil {
			http.Error(w, "r.FormFile err: "+err.Error(), http.StatusBadRequest)
			return
		}

		filename := fmt.Sprintf("%d-hello.txt", time.Now().Unix())
		fw, err := os.OpenFile(filename, os.O_CREATE, 0666)
		if err != nil {
			fmt.Println("os.OpenFile err: ", err)
			http.Error(w, "os.OpenFile err: "+err.Error(), http.StatusBadRequest)
			return
		}

		_, err = io.Copy(fw, f)
		if err != nil {
			fmt.Println("io.Copy err: ", err)
			http.Error(w, "io.Copy err: "+err.Error(), http.StatusBadRequest)
			return
		}

		fw.Close()
		f.Close()

		w.Write([]byte("ok"))
		fmt.Fprint(w, "finished")
	})

	http.ListenAndServe(":8000", nil)
}

client文件:

package main

import (
	"bytes"
	"fmt"
	"io"
	"mime/multipart"
	"net/http"
	"os"
)

func main() {
	buf := bytes.Buffer{}
	wr := multipart.NewWriter(&buf)

	fieldname := "hello"    // 字段名
	filename := "hello.txt" // 文件名

	fw, err := wr.CreateFormFile(fieldname, filename)
	if err != nil {
		fmt.Println("wr.CreateFormFile err: ", err)
		return
	}

	fr, err := os.Open(filename)
	if err != nil {
		fmt.Println("os.Open err: ", err)
		return
	}

	_, err = io.Copy(fw, fr)
	if err != nil {
		fmt.Println("io.Copy err: ", err)
		return
	}

	// -----------------------
	// 创建form和发送请求在同一个函数中,如果这样写会,服务端报错:multipart: NextPart: EOF
	// defer wr.Close()
	// -----------------------
	fr.Close()
	wr.Close()
	// -----------------------

	// 发送请求
	link := "http://127.0.0.1:8000/upload"
	request, err := http.NewRequest(http.MethodPost, link, &buf)
	if err != nil {
		fmt.Println("http.NewRequest err: ", err)
		return
	}

	// 设置header
	request.Header.Set("Content-Type", wr.FormDataContentType())

	client := http.Client{}
	response, err := client.Do(request)
	if err != nil {
		fmt.Println("client.Do err: ", err)
		return
	}

	defer response.Body.Close()
	result, err := io.ReadAll(response.Body)
	fmt.Println(string(result), err)
}
# 报错信息
multipart: NextPart: EOF


# 上述代码说明
......

	// -----------------------
	// 创建form和发送请求在同一个函数中,如果这样写会,服务端报错:multipart: NextPart: EOF
	// defer wr.Close()
	// -----------------------
	fr.Close()
	wr.Close()
	// -----------------------

......

hello.txt文件:

hello world

执行文件:

# 服务端
go run server.go

# 客户端
go run client.go

http://www.kler.cn/a/282395.html

相关文章:

  • ElasticSearch学习笔记二:使用Java客户端
  • Python知识点精汇!字符串:定义、截取(索引)和其内置函数
  • candence : 通孔焊盘、插装器件封装绘制
  • ollama+springboot ai+vue+elementUI整合
  • 使用Python实现深度学习模型:智能食品配送优化
  • Ubuntu20.04 解决一段时间后键盘卡死的问题 ubuntu
  • javascript网页设计案例
  • 【Java设计模式】收集参数模式:掌握高效参数处理
  • Nacos配置中心动态刷新原理
  • 【Hot100】LeetCode—236. 二叉树的最近公共祖先
  • 【Go高性能】测试(单元测试、基准测试)
  • 携程:从MySQL迁移OceanBase的数据库发布系统实践
  • VMware安装Win10系统后,启动系统提示不支持的处理器,怎么解决
  • LVS部署——DR集群
  • 【区块链 + 司法存证】区块链存证仲裁平台 | FISCO BCOS应用案例
  • 力扣8.29
  • 获取项目中的后缀josn文档,转成JSON格式
  • R语言中theme的调整技巧汇总-持续更新
  • Challenge——spfa
  • USB5834数据采集卡30路模拟量采集卡DAQ卡——阿尔泰科技
  • 本地生活本地推软件有哪些?使用过程中需要关注哪些要点?
  • 三分钟总结开源流程表单的优势特点
  • C语言—字符函数和字符串函数
  • 应急响应--日志分析
  • YOLO | YOLO目标检测算法(YOLO-V1)
  • 浙大联合港中深发布AI医疗最新报告,全面审视「虚拟现实+人工智能」