golang原生库mime/multipart上传formdata文件的一个小坑unexpected EOF
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相关推荐
- 在网盘上传大文件,一个G的文件有可能几秒中就上传完了。称为极速秒传,请问它是怎么做到的?
( Java 面试题 ) 这个涉及到 MD5码,具体原理参考<项目应用篇>之"数据的校验"章节. 每个文件都要以生成一个MD5码,用公式表示为: output = MD ...
- 转:使用rz上传压缩文件遇到的一些坑
注意:单独用rz会有两个问题:上传中断.上传文件变化(md5不同),解决办法是上传是用rz -be,并且去掉弹出的对话框中"Upload files as ASCII"前的勾选. ...
- 使用TCP协议写的关于ftp_tcp上传文件下载文件显示文件的小项目(一对一)
server.c服务器端, #include<stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/ ...
- 【杂谈】解决Windows系统下上传速度慢的一个小技巧
这两天郁闷了,硬盘坏了,里面的东西找不回来,毕业设计只能重做,然而重做就重做吧,吸取教训把项目放网盘里,结果TM还上传不上去,真是够了,几经波折折腾到个方法,记录分享一下,这个方法WIN7&W ...
- httpclient base64 文件上传_文件上传下载
说道文件上传下载,这个业务需求并不是很复杂思想如下 1.将文件上传到 某台服务器上的指定的路径下也可以这样理解 文件上传就是将本地图片发送到别的地方,下载就是将别的地方的图片放在本地 2.将路径同文件 ...
- Android之使用Http协议实现文件上传示例(上传MP3文件)
注意一般使用Http协议上传的文件都比较小,一般是小于2M 这里示例是上传一个小的MP3文件 1.主Activity:MainActivity.java view plain public class ...
- curl http header_利用Linux命令cURL实现文件定时上传到ftp服务器的小程序,实用
前言 前段时间群里讨论,想实现某个文件定时上传到服务器要怎么来实现.我记得之前做过 一个项目:为高通的iot模组编写FOTA功能:实现模组可以远程下载升级镜像包,实现版本升级功能.并当时使用的一个超级 ...
- (转)asp.net2.0 上传大容量文件第三方控件radupload
1.web.config 中需要加入: <httpHandlers> <add verb="*" path="Telerik.RadUplo ...
- python urllib3 上传大文件,python urllib3 multipart/form-data 的坑
python urllib3 multipart/form-data 的坑 ################################3.上传文件时带了个header与urllib3.reque ...
最新文章
- 微生物组数据库: 一站式环境基因组学数据云平台更新啦!
- 程序实现:由给定几个数确定凸组合系数,组成一个给定的数
- JS滚轮事件(mousewheel/DOMMouseScroll)了解
- mysql 触发器判断不插入数据_mysql关于触发器怎么判断数据存在时更新不存在时添加呢!...
- 马斯克又破纪录了:120米史上最高火箭已组装,计划今年完成首次轨道试飞
- BAPI_BILLINGDOC_CANCEL1解析
- Project Euler 126 - Cuboid layers
- python与Spark结合,PySpark的机器学习环境搭建和模型开发
- 画出传输门、三态门、开路门_谷仓门优缺点有哪些?安装效果绝对出彩
- linux版wps无法输入中文的解决办法
- Java版通用身份证验证
- pandas算加权平均值_python – 为pandas中的不规则时间序列创建加权平均值
- MySQL 的主从复制(高级篇)
- 字节跳动后台开发实习面试回顾
- 运行阶段及面向对象技巧
- html渐变不兼容,CSS实现兼容性的渐变背景(gradient)效果兼容众多浏览器
- 奇淫技巧 | route命令设置网络优先级
- 【码上实战】【立体匹配系列】经典AD-Census: (1)框架
- [ZT]JavaScript+div实现模态对话框[修正版]
- 浅谈文化创意产业与创意城市 | 上海城市规划
热门文章
- ascii码和数字间的转换
- 脚本大师让电脑操作化繁为简
- 如何在Mac上的App Store中更改您的国家或地区代码?
- 非controller层调用service2种
- 0514课的预习任务
- Win11微信来消息任务栏右下角图标不闪烁怎么办?
- 使用springBoot:run命令启动时报错:An exception occurred while running. null
- 2020 嵌入式系统原理与应用技术(第2版) 期末复习 【整理】 习题2
- nginx 反向代理proxy_pass 后加斜杠和不加斜杆的区别
- 【数学】【裂项相消】Integration-牛客