新项目需要新闻发布功能,类似csdn发帖,前端可使用文本编辑器插件(博主使用JQuery文本编辑器插件),究其原理,编辑器是独立的html,数据提交时内容以html片段存于数据库,文字尚可(假设gbk编码,汉字占2字节,则1M 可存1*1024*1024/2 = 524288个汉字),但编辑器插入大图及多图时,图片通过base64转码为字符串(经测试约1M大小图片转码后的base64码长度约为212266字符),超长文本则导致上传失败,以下为解决办法:
后台为PHP,假设保存编辑器内容字段为content
错误1 content字段类型为varchar
原因:varchar最大长度为65535。
错误2 content 字段类型为mediumtext、Longtext时,上传大文件时出现404错误如下图:解决:使用更大存储数据类型:mediumtext(最多2的24次方-1个字符)、Longtext(最多2的32次方-1个字符)。
猜测1 接口代码异常
经测试小文件可正常上传,排除。
扫描二维码关注公众号,回复: 1747424 查看本文章
猜测2 文件超过POST最大数据量
查阅文献知,理论post没有大小限制,HTTP规范无大小限制,实际post传递的数据量取决服务器设置以及内存。
解决:配置php.ini post_max_size = 200M (phpstudy初始为1M)
结果:大文件上传继续404
猜测3 上传文件大小超出数据库字段保存最大值
理论mediumtext可存储:16777215 字符、Longtext可存:4294967295字符,应该可以满足需求。所以博主手动测试数据库,将之前保存的数据复制若干次后修改该字段,保存后mysql报2006错误如下图:
百度后发现是mysql配置问题,默认max_allowed_packet过小所致。
解决:修改mysql配置文件my.ini,在[mysqld]下添加以下代码
解决猜测 2 及猜测 3 后,大文件保存成功。max_allowed_packet = 100M
interactive_timeout=28800000
wait_timeout=28800000