Discuz!上传文件过程探究
作者:mobiledu2502920897 | 来源:互联网 | 2014-05-27 15:53
有的时候会遇到上传文件失败的问题,肿么办呢?大多数人会说,上传目录没有写权限吧,权限开成777就好了嘛,后台没有开启对应的选项吧,用户组设置上传文件限制大小了有木有?诚然,这些都是上传文件失败的几种常见原因,但这些代表了上传问题的根源吗,事实
有的时候会遇到上传文件失败的问题,肿么办呢?大多数人会说,上传目录没有写权限吧,权限开成777就好了嘛,后台没有开启对应的选项吧,用户组设置上传
文件限制大小了有木有?诚然,这些都是上传文件失败的几种常见原因,但这些代表了上传问题的根源吗,事实告诉我们,上传错误可以是多种多样,花样百出的。
下面我就详细说说上传文件的过程。
【上传文件是怎样炼成的?】
大家都知道上传文件,但文件是怎么上传的呢?
我们来看一段简单的代码:
假设我们使用PHP作为服务器端的脚本语言。
这是上传文件的一个简单HTML代码例子
我们指定了form标签的enctype属性为multipart/form-data,代表了不对表单内字符进行编码,一般在使用包含文件上传控件的表单中使用。
当我们点击按钮提交表单后,浏览器会将请求提交的服务器,服务器保存文件,看似文件上传已经成功,然而这才是文件上传的开始而已呀。
这时候upload.php开始执行,与常用的GET\POST的请求不同,文件上传到服务器后,并没有直接保存到我们需要保存的目录,而是暂存在一个临时文件目录下。
upload.php需要做的就是把这个文件放到我们真正需要存放的目录中。
上传文件的信息会作为一个全局变量保存在$_FILES 数组中。
刚才例子中的文件的信息将会保存在$_FILES[‘userfile’]中(因为我们表单中上传的字段命名为userfile)
$_FILES['userfile']['name'] 客户端机器文件的原名称。
$_FILES['userfile']['type'] 文件的 MIME
类型,需要浏览器提供该信息的支持,例如“image/gif”。
$_FILES['userfile']['size'] 已上传文件的大小,单位为字节。
$_FILES['userfile']['tmp_name']
文件被上传后在服务端储存的临时文件名。(这个很重要,不然就找不到文件了啊)
$_FILES['userfile']['error']
和该文件上传相关的错误代码。(如果有错误,那么之前的几个变量都会是空值,错误将在后面详述)
然后程序根据这些信息,将文件保存到相应的目录下,过程比较简单,代码就不做详细列出了。
【上传失败是怎样炼成的?】
如果上文中的过程顺利,没有错误,那么我们上传工作就完成啦。但老天总不会让事情发展的如此顺利,于是各种的上传失败出现了。
我们以论坛上传附件为例,分析下上传的错误可能都有哪些。
我把错误归纳为三类:
第一类,程序限制。
故名思议,就是Discuz! 的上传限制机制限制了,其实Discuz!
已经给出各个上传失败的提示了,只是如果使用批量上传是无法看到所有提示的嗯,所以我们用单个文件上传来测试。
下面列出上传限制的一些条件,并会给出一些设置的建议(这些限制会在上传失败时提示):
1.不支持此类扩展名
在用户组--编辑--附件相关--允许附件类型、版块--帖子选项--附件类型中可以设定支持上传的附件类型。
同时,注意下全局--附件类型尺寸--对应的附件类型允许的大小。
2.服务器限制无法上传那么大的附件
这个是由于服务器限制了文件大小导致的(后面会讲到),还有,上传0kb的文件也会提示这个嗯
3.用户组限制无法上传那么大的附件
用户组--编辑--附件相关--论坛最大附件尺寸,设置大一些的值,或者设置为0不限制。
4.文件类型限制无法上传那么大的附件
全局--附件类型尺寸--对应的附件类型允许的大小。
5.今日你已无法上传更多的附件
用户组--编辑--附件相关--每天最大附件数量,设置大一些的值,或者设置为0不限制。
6.今日你已无法上传那么大的附件
用户组--编辑--附件相关--每天最大附件总尺寸,设置大一些的值,或者设置为0不限制。表单hash值出错,刷新页面再提交,如果还是失败则还原模板,更新缓存。
8.没有合法的文件被上传
上传文件属于非法文件,选择正常的文件重新发送。选择上传图片时,选择图片类型的文件,而不是其他类型的。
第二类,服务器限制。
当上传文件后提示:
1.服务器限制无法上传那么大的附件
检查下PHP的相关设置。php.ini中的upload_max_filesize,post_max_size两个变量的值是否小于上传文件的大小。
2.附件文件无法保存
Discuz! data目录是否具有读写权限,建议设置data目录包括其子目录权限为777
第三类,其他错误。
除了以上的常规错误之外,还有一些其他疑难症状出现,在此做一个收集和汇总:
特例一:
出现状况:
1.服务器环境:iis+php,小文件上传成功,大文件上传失败,表现为有上传进度,而到最后提示上传失败。
排查情况:
1.Discuz! 程序无修改,正常。
2.后台上传限制关闭,正常。
3.服务器目录权限正确,正常。
4.服务器上传大小限制变量设置正确,正常。
5.上传文件本身没有问题,正常。
按理来说,一切配置都没有问题,为什么上传还是提示失败呢?
原因分析:
为了验证原因,我们跟随程序排查,发现并没有进入php程序的上传流程,而是在上传到服务器临时目录的过程中返回了一个错误:
The FastCGI process exceeded configured
原来是FastCGI进程超时了
解决方法:
找到FastCgi的配置文件“fcgiext.ini”,位于目录“C:\WINDOWS\system32\inetsrv”下。
在“fcgiext.ini”最末php的配置内容下增加一些参数(如原先就有参数,则对原有参数做修改),修改如下:
[Types]
php=PHP
[PHP]
InstanceMaxRequests=10000
EnvirOnmentVars=PHP_FCGI_MAX_REQUESTS:10000
RequestTimeout=500
ActivityTimeout=900
以上是文件上传可能失败的原因和解决方法,可能有疏漏,望有识之士指出~
查看更多
推荐阅读
本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ...
[详细]
蜡笔小新 2024-12-27 18:20:43
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ...
[详细]
蜡笔小新 2024-12-28 13:42:43
QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ...
[详细]
蜡笔小新 2024-12-28 12:33:18
本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ...
[详细]
蜡笔小新 2024-12-28 12:07:46
2023 ARM嵌入式系统全国技术巡讲旨在分享ARM公司在半导体知识产权(IP)领域的最新进展。作为全球领先的IP提供商,ARM在嵌入式处理器市场占据主导地位,其产品广泛应用于90%以上的嵌入式设备中。此次巡讲将邀请来自ARM、飞思卡尔以及华清远见教育集团的行业专家,共同探讨当前嵌入式系统的前沿技术和应用。 ...
[详细]
蜡笔小新 2024-12-28 11:58:48
尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ...
[详细]
蜡笔小新 2024-12-28 11:12:44
本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ...
[详细]
蜡笔小新 2024-12-28 09:49:42
本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ...
[详细]
蜡笔小新 2024-12-28 09:10:26
在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ...
[详细]
蜡笔小新 2024-12-28 08:20:07
本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ...
[详细]
蜡笔小新 2024-12-28 02:40:28
本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ...
[详细]
蜡笔小新 2024-12-27 20:40:29
本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ...
[详细]
蜡笔小新 2024-12-27 19:44:14
本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ...
[详细]
蜡笔小新 2024-12-27 17:52:34
本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ...
[详细]
蜡笔小新 2024-12-27 16:33:32
mobiledu2502920897
这个家伙很懒,什么也没留下!