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

embedded/2024/9/25 4:34:18/

go版本: go1.22.2

server文件:

package mainimport ("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) // 限制上传文件最大10Mf, 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 mainimport ("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}// 设置headerrequest.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.ppmy.cn/embedded/104374.html

相关文章

Jenkins安装使用详解,jenkins实现企业级CICD流程

文章目录 一、资料1、官方文档 二、环境准备1、安装jdk172、安装maven3、安装git4、安装gitlab5、准备我们的springboot项目6、安装jenkins7、安装docker8、安装k8s&#xff08;可选&#xff0c;部署节点&#xff09;9、安装Harbor10、准备带有jdk环境的基础镜像 三、jenkins实…

【设计模式之原型模式——矩形原型】

原型模式的基本实现 创建⼀个抽象类或接⼝&#xff0c;声明⼀个克隆⽅法 clone 具体原型类去实现接口&#xff0c;重写克隆⽅法 客户端中实例化具体原型类的对象&#xff0c;并调⽤其克隆⽅法来&#xff08;赋给&#xff09;创建新的对象。 什么时候实现原型模式 &#xff1f;…

git-命名规范

目录 压轴&#xff1a;压箱底的东西 博客几乎没人说这个&#xff0c;属于不可外传的东西。过段时间&#xff0c;我也会进行访问限制&#xff0c;毕竟&#xff0c;掌握人越少竞争压力越小&#xff0c;我也怕&#xff0c;请删谨慎保存。 分支命名策略&#xff1a; Git分支命名的…

Golang | Leetcode Golang题解之第388题文件的最长绝对路径

题目&#xff1a; 题解&#xff1a; func lengthLongestPath(input string) (ans int) {n : len(input)level : make([]int, n1)for i : 0; i < n; {// 检测当前文件的深度depth : 1for ; i < n && input[i] \t; i {depth}// 统计当前文件名的长度length, isFi…

系统性能调优

1.监控指标 CPU:如果存在大量的计算,他们会长时间不间断的占用CPU资源,导致其他资源无法争夺到CPU而响应缓慢,从而带来系统性能问题,例如频繁的FullGC,以及多线程造成的上下文频繁的切换,都会导致CPU繁忙,一般情况下CPU使用率<75%比较合适。 内存:Java内存一般是通…

软件单元测试工程模版化

一、简介 在汽车领域混了这么多年也做了不少项目&#xff0c;发现很多公司对软件单元测试和代码覆盖率测试根本不重视&#xff0c;或者开发流程就没有单元测试这个流程。但是有的客户需要评审单元测试这个流程&#xff0c;需要有相关的单元测试报告和代码覆盖率统计的报告。如…

使用 @Configuration 和 @Bean 注解替代 XML 配置文件

在 Spring 框架中&#xff0c;Configuration 和 Bean 注解为 Java 配置提供了强大的替代方案&#xff0c;用以代替传统的 XML 配置文件。这种方式不仅简化了配置过程&#xff0c;还提供了更好的类型安全和代码可读性。本文将详细介绍如何使用这些注解来创建配置类&#xff0c;并…

恢复丢失的数据:iPhone 恢复指南

不小心删除了 iPhone 上的重要数据并意识到它没有备份&#xff1f;您并不孤单。在 iPhone 上恢复永久删除的数据似乎令人生畏&#xff0c;但并非总是不可能。我们将探索各种方法&#xff0c;包括使用专门的软件和备份恢复选项&#xff0c;为您提供恢复丢失数据的最佳机会。 常见…