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

打印 上一主题 下一主题

主题 1710|帖子 1710|积分 5130

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
go版本: go1.22.2
server文件:
  1. package main
  2. import (
  3.         "fmt"
  4.         "io"
  5.         "net/http"
  6.         "os"
  7.         "time"
  8. )
  9. func main() {
  10.         http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  11.                 w.Write([]byte("hello world"))
  12.         })
  13.         http.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
  14.                 r.ParseMultipartForm(10 << 20) // 限制上传文件最大10M
  15.                 f, fh, err := r.FormFile("hello")
  16.                 fmt.Println("r.FormFile f: ", f)
  17.                 fmt.Println("r.FormFile fh: ", fh)
  18.                 fmt.Println("r.FormFile err: ", err)
  19.                 if err != nil {
  20.                         http.Error(w, "r.FormFile err: "+err.Error(), http.StatusBadRequest)
  21.                         return
  22.                 }
  23.                 filename := fmt.Sprintf("%d-hello.txt", time.Now().Unix())
  24.                 fw, err := os.OpenFile(filename, os.O_CREATE, 0666)
  25.                 if err != nil {
  26.                         fmt.Println("os.OpenFile err: ", err)
  27.                         http.Error(w, "os.OpenFile err: "+err.Error(), http.StatusBadRequest)
  28.                         return
  29.                 }
  30.                 _, err = io.Copy(fw, f)
  31.                 if err != nil {
  32.                         fmt.Println("io.Copy err: ", err)
  33.                         http.Error(w, "io.Copy err: "+err.Error(), http.StatusBadRequest)
  34.                         return
  35.                 }
  36.                 fw.Close()
  37.                 f.Close()
  38.                 w.Write([]byte("ok"))
  39.                 fmt.Fprint(w, "finished")
  40.         })
  41.         http.ListenAndServe(":8000", nil)
  42. }
复制代码
client文件:
  1. package main
  2. import (
  3.         "bytes"
  4.         "fmt"
  5.         "io"
  6.         "mime/multipart"
  7.         "net/http"
  8.         "os"
  9. )
  10. func main() {
  11.         buf := bytes.Buffer{}
  12.         wr := multipart.NewWriter(&buf)
  13.         fieldname := "hello"    // 字段名
  14.         filename := "hello.txt" // 文件名
  15.         fw, err := wr.CreateFormFile(fieldname, filename)
  16.         if err != nil {
  17.                 fmt.Println("wr.CreateFormFile err: ", err)
  18.                 return
  19.         }
  20.         fr, err := os.Open(filename)
  21.         if err != nil {
  22.                 fmt.Println("os.Open err: ", err)
  23.                 return
  24.         }
  25.         _, err = io.Copy(fw, fr)
  26.         if err != nil {
  27.                 fmt.Println("io.Copy err: ", err)
  28.                 return
  29.         }
  30.         // -----------------------
  31.         // 创建form和发送请求在同一个函数中,如果这样写会,服务端报错:multipart: NextPart: EOF
  32.         // defer wr.Close()
  33.         // -----------------------
  34.         fr.Close()
  35.         wr.Close()
  36.         // -----------------------
  37.         // 发送请求
  38.         link := "http://127.0.0.1:8000/upload"
  39.         request, err := http.NewRequest(http.MethodPost, link, &buf)
  40.         if err != nil {
  41.                 fmt.Println("http.NewRequest err: ", err)
  42.                 return
  43.         }
  44.         // 设置header
  45.         request.Header.Set("Content-Type", wr.FormDataContentType())
  46.         client := http.Client{}
  47.         response, err := client.Do(request)
  48.         if err != nil {
  49.                 fmt.Println("client.Do err: ", err)
  50.                 return
  51.         }
  52.         defer response.Body.Close()
  53.         result, err := io.ReadAll(response.Body)
  54.         fmt.Println(string(result), err)
  55. }
复制代码
  1. # 报错信息
  2. multipart: NextPart: EOF
  3. # 上述代码说明
  4. ......
  5.         // -----------------------
  6.         // 创建form和发送请求在同一个函数中,如果这样写会,服务端报错:multipart: NextPart: EOF
  7.         // defer wr.Close()
  8.         // -----------------------
  9.         fr.Close()
  10.         wr.Close()
  11.         // -----------------------
  12. ......
复制代码
hello.txt文件:
  1. hello world
复制代码
实验文件:
  1. # 服务端
  2. go run server.go
  3. # 客户端
  4. go run client.go
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表