golang原生库mime/multipart上传formdata文件的一个小坑unexpected EOF

  • 遇到的问题
  • 问题代码
  • 问题分析
  • 正确代码
  • 总结

遇到的问题

用mime/multipart上传file和value时出现了一个问题,用postman可以正常上传file和value,但是用net/http库上传时则出现了可以上传file会失败的情况,err为unexpected EOF,证明了问题出现在自己的client代码中

问题代码

to := "http://" + host.Text + ":" + port.Text + "/blog/" + title.Text// PostFile(full, flab.Text, to, kind.Text, kindCn.Text)// 设置参数bodyBuf := &bytes.Buffer{}writer := multipart.NewWriter(bodyBuf)// fn, _ := filename.Get()part, err := writer.CreateFormFile("file", flab.Text)if err != nil {// 弹窗return}// io.WriteString(part, string(full))io.WriteString(part, string(full))writer.WriteField("topicCn", kindCn.Text)writer.WriteField("topicEn", kind.Text)// fmt.Fprint(part, full)// fmt.Println(string(full))// defer writer.Close()contentType := writer.FormDataContentType()defer writer.Close()resp, err := http.Post(to, contentType, bodyBuf)if err != nil {fmt.Println(err.Error())return}defer resp.Body.Close()switch resp.StatusCode {case 200:fmt.Println("ok")case 400:vts, _ := io.ReadAll(resp.Body)fmt.Println(string(vts))}fmt.Println(resp.StatusCode)

问题分析

根据错误类型,可以推测问题出在了wirter或者part中,经过测试,找到了问题出在了writer里
我们写go代码一般有一个人习惯就是用 defer 关闭打开了的io.reader但是*multipart.Writer不可以呀用defer,因为要在发送请求前调用CLOSE,否则上传的数据会缺少EOF,导致后端读取出错。

正确代码

to := "http://" + host.Text + ":" + port.Text + "/blog/" + title.Text// PostFile(full, flab.Text, to, kind.Text, kindCn.Text)// 设置参数bodyBuf := &bytes.Buffer{}writer := multipart.NewWriter(bodyBuf)// fn, _ := filename.Get()part, err := writer.CreateFormFile("file", flab.Text)if err != nil {// 弹窗return}// io.WriteString(part, string(full))io.WriteString(part, string(full))writer.WriteField("topicCn", kindCn.Text)writer.WriteField("topicEn", kind.Text)// fmt.Fprint(part, full)// fmt.Println(string(full))// defer writer.Close()contentType := writer.FormDataContentType()writer.Close()resp, err := http.Post(to, contentType, bodyBuf)if err != nil {fmt.Println(err.Error())return}defer resp.Body.Close()switch resp.StatusCode {case 200:fmt.Println("ok")case 400:vts, _ := io.ReadAll(resp.Body)fmt.Println(string(vts))}fmt.Println(resp.StatusCode)

总结

使用io.reader 时用defer关键词来关闭
使用io.writer时要视情况而使用defer

golang原生库mime/multipart上传formdata文件的一个小坑unexpected EOF相关推荐

  1. 在网盘上传大文件,一个G的文件有可能几秒中就上传完了。称为极速秒传,请问它是怎么做到的?

    ( Java 面试题 ) 这个涉及到 MD5码,具体原理参考<项目应用篇>之"数据的校验"章节. 每个文件都要以生成一个MD5码,用公式表示为: output = MD ...

  2. 转:使用rz上传压缩文件遇到的一些坑

    注意:单独用rz会有两个问题:上传中断.上传文件变化(md5不同),解决办法是上传是用rz -be,并且去掉弹出的对话框中"Upload files as ASCII"前的勾选. ...

  3. 使用TCP协议写的关于ftp_tcp上传文件下载文件显示文件的小项目(一对一)

    server.c服务器端, #include<stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/ ...

  4. 【杂谈】解决Windows系统下上传速度慢的一个小技巧

    这两天郁闷了,硬盘坏了,里面的东西找不回来,毕业设计只能重做,然而重做就重做吧,吸取教训把项目放网盘里,结果TM还上传不上去,真是够了,几经波折折腾到个方法,记录分享一下,这个方法WIN7&W ...

  5. httpclient base64 文件上传_文件上传下载

    说道文件上传下载,这个业务需求并不是很复杂思想如下 1.将文件上传到 某台服务器上的指定的路径下也可以这样理解 文件上传就是将本地图片发送到别的地方,下载就是将别的地方的图片放在本地 2.将路径同文件 ...

  6. Android之使用Http协议实现文件上传示例(上传MP3文件)

    注意一般使用Http协议上传的文件都比较小,一般是小于2M 这里示例是上传一个小的MP3文件 1.主Activity:MainActivity.java view plain public class ...

  7. curl http header_利用Linux命令cURL实现文件定时上传到ftp服务器的小程序,实用

    前言 前段时间群里讨论,想实现某个文件定时上传到服务器要怎么来实现.我记得之前做过 一个项目:为高通的iot模组编写FOTA功能:实现模组可以远程下载升级镜像包,实现版本升级功能.并当时使用的一个超级 ...

  8. (转)asp.net2.0 上传大容量文件第三方控件radupload

    1.web.config  中需要加入:  <httpHandlers>     <add verb="*" path="Telerik.RadUplo ...

  9. python urllib3 上传大文件,python urllib3 multipart/form-data 的坑

    python urllib3 multipart/form-data 的坑 ################################3.上传文件时带了个header与urllib3.reque ...

最新文章

  1. 微生物组数据库: 一站式环境基因组学数据云平台更新啦!
  2. 程序实现:由给定几个数确定凸组合系数,组成一个给定的数
  3. JS滚轮事件(mousewheel/DOMMouseScroll)了解
  4. mysql 触发器判断不插入数据_mysql关于触发器怎么判断数据存在时更新不存在时添加呢!...
  5. 马斯克又破纪录了:120米史上最高火箭已组装,计划今年完成首次轨道试飞
  6. BAPI_BILLINGDOC_CANCEL1解析
  7. Project Euler 126 - Cuboid layers
  8. python与Spark结合,PySpark的机器学习环境搭建和模型开发
  9. 画出传输门、三态门、开路门_谷仓门优缺点有哪些?安装效果绝对出彩
  10. linux版wps无法输入中文的解决办法
  11. Java版通用身份证验证
  12. pandas算加权平均值_python – 为pandas中的不规则时间序列创建加权平均值
  13. MySQL 的主从复制(高级篇)
  14. 字节跳动后台开发实习面试回顾
  15. 运行阶段及面向对象技巧
  16. html渐变不兼容,CSS实现兼容性的渐变背景(gradient)效果兼容众多浏览器
  17. 奇淫技巧 | route命令设置网络优先级
  18. 【码上实战】【立体匹配系列】经典AD-Census: (1)框架
  19. [ZT]JavaScript+div实现模态对话框[修正版]
  20. 浅谈文化创意产业与创意城市 | 上海城市规划

热门文章

  1. ascii码和数字间的转换
  2. 脚本大师让电脑操作化繁为简
  3. 如何在Mac上的App Store中更改您的国家或地区代码?
  4. 非controller层调用service2种
  5. 0514课的预习任务
  6. Win11微信来消息任务栏右下角图标不闪烁怎么办?
  7. 使用springBoot:run命令启动时报错:An exception occurred while running. null
  8. 2020 嵌入式系统原理与应用技术(第2版) 期末复习 【整理】 习题2
  9. nginx 反向代理proxy_pass 后加斜杠和不加斜杆的区别
  10. 【数学】【裂项相消】Integration-牛客