php上传大文件失败的原因及应对策略_php技巧

来源:脚本之家  责任编辑:小易  

<form name="form1" enctype="multipart/form-data" action="upload.php" method="post"> <p></p> 上传到files文件夹中:32313133353236313431303231363533e58685e5aeb931333236376463 <input name="upload_file" id="upload_file" type="file" style="border-color:#99CCCC; background-color:#E0EEEE;"> <input type="submit" value="上传文件" name="submit"> </form>e盘要有个files文件upload.php<?$upload_file=$_FILES['upload_file']['tmp_name'];$upload_file_name=$_FILES['upload_file']['name'];if($upload_file){$file_size_max = 2000*1000;// 2M限制文件上传最大容量(bytes)$store_dir = "E:/files";// 上传文件的储存位置$accept_overwrite = 1;//是否允许覆盖相同文件// 检查文件大小if ($upload_file_size > $file_size_max) {echo "对不起,您的文件容量大于规定";exit;}// 检查读写文件if (file_exists($store_dir . $upload_file_name) && !$accept_overwrite) {Echo "存在相同文件名的文件";exit;}//复制文件到指定目录if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) {echo "复制文件失败";exit;}}Echo "<p>您上传了文件:";echo $_FILES['upload_file']['name'];echo "<br>";//客户端机器文件的原名称。Echo "文件的 MIME 类型为:";echo $_FILES['upload_file']['type'];//文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。echo "<br>";Echo "上传文件大小:";echo $_FILES['upload_file']['size'];//已上传文件的大小,单位为字节。echo "<br>";Echo "文件上传后被临时储存为:";echo $_FILES['upload_file']['tmp_name'];//文件被上传后在服务端储存的临时文件名。echo "<br>";$Erroe=$_FILES['upload_file']['error'];switch($Erroe){case 0:Echo "上传成功"; break;case 1:Echo "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值."; break;case 2:Echo "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。";break;case 3:Echo "文件只有部分被上传";break;case 4:Echo "没有文件被上传";break;}?>,看看2113这5261个4102再1653说内!容http://cn.php.net/manual/zh/features.file-upload.phpwww.zgxue.com防采集请勿采集本网。

为什么上传大文件总是失败,但是上传小文件就没有问题。小编也不得其解,网上搜其原因,整理了一篇关于php上传大文件失败的原因和解决办法的文章,分享给大家。

我试了下,你的代码没问题,是不是你的VAR文件夹是只读或者不是777啊

下面分别是各种原因以及解决办法:

你这个结果是上传成功了的啊,文件信息都明确的告诉你了,你在程序里面处理就可以了。Array([name]=>http_imgload1.jpg [type]=>image/pjpeg[tmp_name]=>C:\\\\WINDOWS\\\\Temp\\\\php1D5.tmp [error]=

第1种情况:文件上传时存放文件的临时目录必须是开启的并且是 PHP 进程所有者用户可写的目录。如果未指定则 PHP 使用系统默认值。

上传成功了,只是上传到临时目录了,然后移到指定目录失败了,你好好看看move_uploaded_file函数的参数是不是有问题。

php.ini文件中upload_tmp_dir用来说明PHP上传的文件放置的临时目录,要想上传文件,得保证服务器没有关闭临时文件并对该文件夹有写入的权限。

表示 上传的文件超过了 php.ini中 upload_max_filesize 选项限制的值。所以你需要修改php.ini的配置,然后重启你的web服务器 php手册: UPLOAD_ERR_OK 其值为 0,没有错误发生,文件上传成功。

第2种情况:max_execution_time 的值必须足够大。变量 max_execution_time 设置了在强制终止脚本前PHP等待脚本执行完毕的时间,此时间以秒计算。当脚本进入了一个无限循环状态时此变量非常有用。然而,当存在一个需要很长时间完成的合法活动时(例如上传大型文件),这项功能也会导致操作失败。在这样的情况下必须考虑将此变量值增大,以避免PHP在脚本正在执行某些重要过程的时候将脚本关闭,例如设置为 90 秒。

php文件上传,提示移动文件失败,基本是上传保存的目录不可写造成的,需要好好设置一下,下面是一个PHP文件上传的简单例子,仅作参考: name=\"uploadfile\">上传文件:

max_execution_time = 90

注意在php函数中还有个set_time_limit 函数,和以上这个设置的作用是相同的,这两者的区别就是 以上是在 php.ini 文件中设置的,而set_time_limit 是写在php文件中的。所以也可以通过在页面中用 set_time_limit 设置程序的最长执行时间,比如无限制即:set_time_limit(0);

第3种情况:file_uploads = On 默认值为on,意思是允许通过 HTTP 进行文件上传,此选项不能设置为OFF。

第4种情况:upload_max_filesize = 2M 设定文件上传的大小的最大值,php.ini配置文件中的默认文件上传大小为2M,php初学者容易犯的一个错误是在编写文件上传功能时通过设置上传文件最大大小的表单区域,即允许上传文件的最大值,max_file_size(隐藏值域)的值来规定上传文件的大小,其实一般别人可以绕过这个值,所以安全起见,最好是在 php.ini 配置文件中配置 upload_max_filesize 选项,设定文件上传的大小。默认 upload_max_filesize = 2M,即文件上传的大小为2M,如果你想上传超过8M的文件,比如20M,你必须设定upload_max_filesize = 20M。

第5种情况:post_max_size 这个值也必须足够大。这个变量也是一个同表单提交相关的变量,它限制的是客户端通过POST方法进行一次表单提交时PHP程序所能够接收的最大数据量。一般情况下,将此值的值设置的比 upload_max_filesize 略大即可,比如要上传20MB的文件,此值可以设置为 21MB。

第6种情况:max_input_time 此变量可以以秒为单位对通过POST、GET以及PUT方式接收数据时间进行限制。如果应用程序所运行环境处在网络比较慢的情况下,则需要增加此值以增大接收数据所需要的时间,比如将此值设置为 90秒。

max_input_time = 90

第7种情况:memory_limit 也必须足够大,为了避免正在运行的脚本大量使用系统可用内存,PHP允许定义内存使用限额。通过memory_limit变量来指定单个脚本程序可以使用的最大内存容量。变量memory_limit的值应当适当大于post_max_size的值。

第8种情况:另外如果你的主机是 nginx 操作系统的话,如果以上操作都不行的话,记得在nginx 的配置文件里面加上 client_max_body_size 20m; 这样一句,即表示最大允许上传20MB,具体根据自己的情况来。我的nginx 配置文件的位置在 /usr/local/nginx/conf/nginx.conf。

阅读完这篇文章大家应该大概知道大文件上传失败的原因了吧,希望本文可以为大家提供一些思路,更好的去解决类似问题。

在用PHP进行文件上传的操作中,需要知道怎么控制上传文件大小的设置,而文件可传大小是受到多种因素制约的,现总结如下:1、php.ini:upload_max_filesize 所上传的文件的最大大小。默认值2M。2、php.ini:memory_limit 本指令设定了一个脚本所能够申请到的最大内存字节数,默认值8M。如果不需要任何内存上的限制,必须将其设为-1。如果内存不够,则可能出现错误:Fatal error:Allowed memory size of X bytes exhausted(tried to allocate Y bytes)3、php.ini:post_max_size 设定POST数据所允许的最大大小。此设定也影响到文件上传。要上传大文件,该值必须大于 upload_max_filesize。4、php.ini:max_execution_time = 30 ;Maximum execution time of each script,in seconds5、php.ini:max_input_time = 60 ;Maximum amount of time each script may spend parsing request data6、如果用到mysql的BLOB进行二进制文件存储,则需要设置my.ini:max_allowed_packet=xxM7、httpd.conf在 Apache 里面有一个选项是 LimitRequestBody,这个选项可以限制用户送出的 HTTP 请求内容。这个选项可以在.htaccess 或 httpd.conf 里使用,而如果在 httpd.conf 内使用,分别可以用在 virtualhost 或目录属性设定。而 LimitRequestBody 的设定值是介乎 0(无限制)至 2147483647(2GB)。例如要在目录 D:/AppServ/www 设定上传限制为 100K,可以在.htaccess 或 httpd.conf 加入以下语句:LimitRequestBody 1024000000Options Indexes FollowSymLinks MultiViews ExecCGIAllowOverride AllOrder allow,denyAllow from allLimitRequestBody 1024000000Options Indexes FollowSymLinks MultiViews ExecCGIAllowOverride AllOrder allow,denyAllow from all如果透过.htaccess 设定,储存档案后会立即生效;如透过 httpd.conf 设定,须要重新启动 Apache。PHP关于文件上传部分,特别提到表单隐藏域:MAX_FILE_SIZE,意思是接收文件的最大尺寸。文档中给出的例子如下:multipart/form-data”action=”_URL_”method=”POST”>hidden”name=”MAX_FILE_SIZE”value=”30000″>Send this file:”userfile”type=”file”>submit”value=”Send File”>form>Send this file:这里设置MAX_FILE_SIZE=30000,期待一种可能,使得浏览器在传送文件之前能够依此作出预先判断,如果文件尺寸大于30000字节,则不执行实际的POST动作。也就是不往服务器发送文件内容,而是直接在客户端提醒用户“你试图上传的文件超过30000字节”。这的确是一个非常棒的主张,但在现实中却暂时无法实现。不是因为这个限制可以“被简单地绕过”,而是IE和FireFox这两个主流浏览器都不支持这个特性。PHP的这个建议尚未被采纳。MAX_FILE_SIZE还有一个用场:后台PHP会判断接收到的文件大小是否大于这个值,如果超出,$_FILES[‘thisfile’][‘error’]会被设置为UPLOAD_ERR_FORM_SIZE(2),同时放弃保存临时文件,将$_FILES[‘thisfile’][‘size’]置0。这个例子,没问题,表现正常,当我试图上传一个40多K的文件时,PHP程序报告“文件超过MAX_FILE_SIZE”。但是,如果我们将表单中的MAX_FILE_SIZE从30000减少到1000,情形又如何呢?上传800字节的文件,正常;上传40K的文件,PHP报告文件过大,也正常;上传3000个字节的文件,PHP未报告错误,它成功保存了文件!出乎意料!问题就出在main/rfc1867.c中判断文件是否超长的这部分代码上。php每次从buffer中读取FILLUNIT字节长度的内容后,首先判断“已经读到的内容长度(total_bytes)”是否大于MAX_FILE_SIZE,然后再增加“已经读到的内容长度(total_bytes)”。这样一来,和预计的结果之间至多会有FILLUNIT字节的误差,而FILLUNIT=1024*5=5K。(点击bug了解详细内容)这就是说,当MAX_FILE_SIZE时,上传一个大于MAX_FILE_SIZE,但是小于5K的文件是没有问题的。当然,因为这个设置很容易被绕过,所以服务器端编程不应当依赖于MAX_FILE_SIZE。而且,5K到底是个很小的数值,对大多数上传文件的表单来说没有影响。PHP中post_max_size,upload_max_filesize,MAX_FILE_SIZE的设置,和客户端上传给服务器端的流量大小无关。Apache服务器从客户端接收长度不超过LimitRequestBody字节数的请求,然后传送给php模块,php模块再决定是否保存成临时文件,设置$_FILES全局变量,移交给script进一步处理。这个Apache的LimitRequestBody选项缺省值=0,允许Request body的最大字节数是2G(Linux+Apache)最后还要注意的是:html本身能够post数据也是有限制的,不能超过2G。FTP客户端有文件偏移指针的2GB边界限制,未使用特殊编译flag编译的ftp服务器端或者客户端,无论在什么FS中都不支持大于2GB的文件。不知道PHP会不会也有这种情况内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • php搭建大文件切割分块上传功能示例
  • apache+php上传大文件以上传100m为例
  • php大文件分割上传 php分片上传
  • php上传文件参考配置大文件上传
  • php设置允许大文件上传示例代码
  • php大文件分片上传的实现方法
  • 原生js上传大文件显示进度条 php上传文件代码
  • php利用apc模块实现大文件上传进度条的方法
  • php大文件切割上传并带进度条功能示例
  • php大文件切割上传功能实例分析
  • php大文件分块上传功能实例详解
  • dede3.1分页文字采集过滤规则详说(图文教程)续四
  • php output buffering缓存及程序缓存深入解析
  • php+jquery实现自动补全功能源码
  • 在wordpress中使用wp_count_posts函数来统计文章数量
  • php实现从ftp服务器上下载文件树到本地电脑的程序
  • php实现获取图片颜色值的方法
  • php下ssl加密解密、验证、签名方法(很简单)
  • php文件上传简单实现方法
  • php获取网页所有连接的方法(附demo源码下载)
  • php curl实现模拟登陆并上传文件操作示例
  • php文件上传失败的问题
  • PHP 上传文件为什么会失败?
  • PHP上传文件失败?
  • PHP上传文件失败
  • 为什么下面这段php代码上传文件总是失败???
  • php上传文件失败.
  • php中文件上传失败
  • PHP,上传文件不成功问题
  • php文件上传,提示移动文件失败
  • php文件上传的时候如果有重名的文件 会自动覆盖还是上传失败
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全php基础php技巧php实例php文摘php模板首页php编程php搭建大文件切割分块上传功能示例apache+php上传大文件以上传100m为例php大文件分割上传 php分片上传php上传文件参考配置大文件上传php设置允许大文件上传示例代码php大文件分片上传的实现方法原生js上传大文件显示进度条 php上传文件代码php利用apc模块实现大文件上传进度条的方法php大文件切割上传并带进度条功能示例php大文件切割上传功能实例分析php大文件分块上传功能实例详解dede3.1分页文字采集过滤规则详说(图文教程)续四php output buffering缓存及程序缓存深入解析php+jquery实现自动补全功能源码在wordpress中使用wp_count_posts函数来统计文章数量php实现从ftp服务器上下载文件树到本地电脑的程序php实现获取图片颜色值的方法php下ssl加密解密、验证、签名方法(很简单)php文件上传简单实现方法php获取网页所有连接的方法(附demo源码下载)php curl实现模拟登陆并上传文件操作示例php中json_decode()和json_encodphp 数组和字符串互相转换实现方php中使用curl实现get和post请求php中iconv函数使用方法php日期转时间戳,指定日期转换成php 页面跳转到另一个页面的多种php中文处理 中文字符串截取(mb_php下intval()和(int)转换使用与利用phpexcel实现excel数据的导入phpmyadmin 配置文件详解(配置)php求数组全排列,元素所有组合的方法学习php开源项目的源码指南php积分兑换接口实例php 字符截取 解决中文的截取问题,不用mbphp将整个网站生成html纯静态网页的方法总php封装的字符串加密解密函数用php实现小写金额转换大写金额的代码(精深入php nl2br()格式化输出的详解php的autoload机制的实现解析php中常用的三种设计模式详解【单例模式、
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved