文件已经上传到服务器翻译,服务器接受上传的优化 翻译+源码分析

一般的做法

err := r.ParseMultipartForm(32 << 20) // 32Mb

if err != nil {

http.Error(w, err.Error(), http.StatusBadRequest)

}

问题

请注意,32Mb是分配给请求体的字节存储在内存中,而不是请求体的限制,当满(33Mb)时,它将写入临时目录。

查看源码

src/net/http/request.go中

func (r *Request) ParseMultipartForm(maxMemory int64) error {

...

f, err := mr.ReadForm(maxMemory)

...

}

func (r *Reader) ReadForm(maxMemory int64) (*Form, error) {

return r.readForm(maxMemory)

}

func (r *Reader) readForm(maxMemory int64) (_ *Form, err error) {

...

n, err := io.CopyN(&b, p, maxMemory+1)

...

if n > maxMemory {

可以看到这里把剩余的内容写入到临时文件了

file, err := ioutil.TempFile("", "multipart-")

size, err := io.Copy(file, io.MultiReader(&b, p))

...

}

...

}

解决方案一

直接限制客户端上传大小,但是有时候这个数字不通用而且不合适,而且文件类型的检查也没法做

r.Body = http.MaxBytesReader(w, r.Body, 32<<20+512)

解决方案二

自己逐步解析

r.Body = http.MaxBytesReader(w, r.Body, 32<<20+1024)

reader, err := r.MultipartReader()

if err != nil {

http.Error(w, err.Error(), http.StatusBadRequest)

return

}

// parse text field

text := make([]byte, 512)

p, err := reader.NextPart()

// one more field to parse, EOF is considered as failure here

if err != nil {

http.Error(w, err.Error(), http.StatusInternalServerError)

return

}

if p.FormName() != "text_field" {

http.Error(w, "text_field is expected", http.StatusBadRequest)

return

}

_, err = p.Read(text)

if err != nil && err != io.EOF {

http.Error(w, err.Error(), http.StatusInternalServerError)

return

}

// parse file field

p, err = reader.NextPart()

if err != nil && err != io.EOF {

http.Error(w, err.Error(), http.StatusInternalServerError)

return

}

if p.FormName() != "file_field" {

http.Error(w, "file_field is expected", http.StatusBadRequest)

return

}

buf := bufio.NewReader(p)

sniff, _ := buf.Peek(512)

contentType := http.DetectContentType(sniff)

if contentType != "application/zip" {

http.Error(w, "file type not allowed", http.StatusBadRequest)

return

}

f, err := ioutil.TempFile("", "")

if err != nil {

http.Error(w, err.Error(), http.StatusInternalServerError)

return

}

defer f.Close()

var maxSize int64 = 32 << 20

lmt := io.MultiReader(buf, io.LimitReader(p, maxSize - 511))

written, err := io.Copy(f, lmt)

if err != nil && err != io.EOF {

http.Error(w, err.Error(), http.StatusInternalServerError)

return

}

if written > maxSize {

os.Remove(f.Name())

http.Error(w, "file size over limit", http.StatusBadRequest)

return

}

提示:

只在POST主体中获取前两个部分,处理程序将期望text_field然后file_field

使用bufio.Reader包装part reader(先查看512字节)断言文件类型

使用io.LimitReader限制文件大小(使用1个字节的偏移量来查看part reader是否还有一些数据)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

隐藏a标签seo_让黑帽都惊了,远离百度惩处的seo技术

一、什么是黑帽SEO黑帽SEO&#xff0c;即SEO作弊&#xff0c;是指为了提高网站在搜索引擎中展现机会和排名的目的&#xff0c;欺骗搜索引擎的行为“黑帽”技术与搜索引擎算法相排斥&#xff0c;是搜索引擎不允许的。一旦被发现使用“黑帽”技术&#xff0c;那么网站排名会被降低…

前端学习(1501):一次帮别人解决问题的案例

超开心 只能添加姓名 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </…

PHP的time函数返回时间不正确

PHP的time()得到的时间与当前时间相差很多&#xff0c;检查了PHP.ini&#xff0c;发现是时区不对。在PHP.ini中&#xff0c;当前设置为&#xff1a; [Date]; Defines the default timezone used by the date functions; http://php.net/date.timezonedate.timezone Europe/Par…

微信小程序服务器sessionid,微信小程序sessionid不一致问题解决

微信小程序sessionid不一致问题解决,里加,两次,在后面,解决办法,缓存微信小程序sessionid不一致问题解决易采站长站&#xff0c;站长之家为您整理了微信小程序sessionid不一致问题解决的相关内容。问题由于小程序端两次请求的 sessionid 不一致&#xff0c; 导致后端无法取得 s…

mysql 加字段_MySQL8.0大表秒加字段,是真的吗?

前言&#xff1a;很早就听说 MySQL8.0 支持快速加列&#xff0c;可以实现大表秒级加字段。笔者自己本地也有8.0环境&#xff0c;但一直未进行测试。本篇文章我们就一起来看下 MySQL8.0 快速加列到底要如何操作。1.了解背景信息表结构的变更是业务运行过程中比较常见的需求之一&…

SQLServer学习笔记系列4

一.写在前面的话 好多天没有记录sql学习笔记了&#xff0c;要坚持下去&#xff0c;坚信每一点的进步都是为在积蓄力量。今天看到一幅图&#xff0c;特此分享出来。 通过这幅图&#xff0c;我看到的是每人站在自己的角度看问题&#xff0c;感受是不一样的&#xff0c;就如同学习…

随便选一张扑克牌_扑克牌魔术手法教学,简单易学的纸牌魔术,三分钟让你成为大师...

标签&#xff1a; 魔术手法 扑克牌魔术 魔术技巧教学 纸牌魔术揭秘所有的纸牌魔术家都知道怎样假装把一张牌塞进牌堆&#xff0c;然后从顶部翻出来来让观众吃惊。这个技巧用来练习手速、手指灵敏度、适时分散观众注意力和表演艺术绝对是不可或缺。这里就给大家介绍一下吧&#…

JAVA求集合中的组合

好几个月没弄代码了&#xff0c;今天弄个求组合的DEMO 思路是将集合的每个值对照一个索引&#xff0c;索引大小是集合的大小2.索引默认为[000...000]&#xff0c;当组合后选取的组合值demo为[0100..00]。然后根据遍历索引来到集合中取值。 上代码&#xff1a; import java.util…

mysql使用手册_mysql使用手册

mysql使用手册1、mysql登录1.1 远程登陆mysqlmysql -h ip -u root -p 密码1.2 本地登陆mysqlmysql -u root -p 密码2、为数据库配置远程连接权限采用授权法例如&#xff1a;以用户名&#xff1a;root 密码&#xff1a;888888从任何主机连接到mysql服务器先在服务器上用root用户…

Android项目使用Eclipse进行单元测试

Android项目如果每次都整个调试的话&#xff0c;要加载UI&#xff0c;会等很长时间。所以单元测试就显得很方便了。 要进行单元测试&#xff0c;首先得修改下AndroidManifest.xml文件。在Instrument标签里点右侧的Add按钮。然后在弹出的窗口双击 Instrument。然后在右侧就会多出…

mysql union 用法 update_mysql---union的用法

union的作用很简单用来合并两条sql的结果集语法: SQL1 UNION SQL2现有一张价格表要求&#xff1a;求出价格低于2000和价格高于3000的商品&#xff0c;不能用or和not between……and思路&#xff1a;我们可以先求出低于2000的商品得到结果集1再求出高于3000的商品得到结果集2再利…

mysql 中有没有临时表_MySQL临时表的简单用法

当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询。创建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字:CREAT…

java中==与equals的区别

值类型是存储在内存中的堆栈&#xff08;以后简称栈&#xff09;&#xff0c;而引用类型的变量在栈中仅仅是存储引用类型变量的地址&#xff0c;而其本身则存储在堆中。 操作比较的是两个变量的值是否相等&#xff0c;对于引用型变量表示的是两个变量在堆中存储的地址是否相同&…

3399 mysql_手动安装 mysql

手动安装 mysql需要在本机 (mac) 上装个 mysql, 看到压缩版的体积最小, 结果进入了手工安装的坑(正常有界面可以安装, 但安装目录将是 / usr/local/mysql), 既然入了坑就填上吧.1, 解压到自己选择的目录, 比如 / data/mysql.2, 初始化数据库: sudo /data/mysql/bin/mysqld --in…

构建之法第11、12章

第11章软件设计与实现 主要讲了典型的开发流程和开发阶段的一些管理方法 问题&#xff1a; 从spec道实现是代码的实现吗&#xff1f; 第12章 用户体验 主要讲了用户体验的各种角度和认识阻力登 问题&#xff1a; 用户的体验是设计前就要考虑的吗&#xff1f;转载于:https://www…

Mybatis多对多,复杂增删改查(特殊需求循环插入,分组查询)

2021.8.31 从25号开始练习复杂的mybatis多对多&#xff0c;从设计数据库思路到实现需求功能转移到实体项目中 1.之前很少看过字符转换的详细内容从今往后会注意字符串转换此项目为转数组&#xff08;date&#xff09;实体项目会有UUID生成的字符串 2.在添加时如果原表设计的首个…

MDI窗体简单方法(调用,闪屏)

MDI窗体简单方法&#xff08;调用,闪屏&#xff09; 调用方式&#xff1a; RibbonForm mdishow new RibbonForm(); //实例化midshow.MdiParent this; //设置在主窗体&#xff0c;以MDI的方式显示&#xff0c;关键属性。mdishou.Show();//显示窗体大伙都会碰到的问题。 解决…

kubernetes mysql pxc_K8S使用operator部署和管理Percona - PXC集群

概述pxc为mysql的一种集群模型&#xff0c;我们结合operator和k8s 完成pxc的部署和扩容硬盘使用local卷&#xff0c;如何管理local卷请翻阅 我的另一篇文章https://www.jianshu.com/p/bfa204cef8c0英文文档详情 https://percona.github.io/percona-xtradb-cluster-operator/con…