php上传文件错误怎么解决

作者&投稿:一凡 (若有异议请与网页底部的电邮联系)
PHP 上传文件错误常见问题和解决方法~

注意表单的Form标签中一定要添加 enctype=”multipart/form-data”文件才能上传。
你在后台php页面输出看看F_ILE看看能不能接收到值.

在用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 seconds
5、php.ini:max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
6、如果用到mysql的BLOB进行二进制文件存储,则需要设置my.ini:max_allowed_packet=xxM

7、httpd.conf
在 Apache 里面有一个选项是 LimitRequestBody,这个选项可以限制用户送出的 HTTP 请求内容。这个选项可以在 .htaccess 或 httpd.conf 里使用,而如果在 httpd.conf 内使用,分别可以用在 virtualhost 或目录属性设定。而 LimitRequestBody 的设定值是介乎 0 (无限制) 至 2147483647 (2GB)。
例如要在目录 D:/AppServ/www 设定上传限制为 100K,可以在 .htaccess 或 httpd.conf 加入以下语句:
LimitRequestBody 1024000000
Options Indexes FollowSymLinks MultiViews ExecCGI
AllowOverride All
Order allow,deny
Allow from all
LimitRequestBody 1024000000Options Indexes FollowSymLinks MultiViews ExecCGIAllowOverride AllOrder allow,denyAllow from all
如果透过 .htaccess 设定,储存档案后会立即生效;如透过 httpd.conf 设定,须要重新启动 Apache。
PHP关于文件上传部分,特别提到表单隐藏域:MAX_FILE_SIZE,意思是接收文件的最大尺寸。文档中给出的例子如下:


Send this 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<5K时,上传一个大于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会不会也有这种情况。

<html>
<body>
<form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
Choose a file to upload: <input name="uploaded_file" type="file" />
<input type="submit" value="Upload" />
</form>
</body>
</html>

有一些规则需要建设时遵循HTML表单。首先,请确保该窗体使用POST方法。第二,形

式需要以下属性:字符编码=“多重/表单数据”。它指定的内容类型时使用的信息提

交给伺服器。如果没有这些要求,您的文件上传不了。

另一个需要注意的是隐藏的表单字段名为MAX_FILE_SIZE设置的值。某些Web浏览器实

际上反映了这个领域,也不会允许用户上载文件超过这个数字(字节)更大。您应该

将此值设置为配合最大上传大小,在php.ini文件中设置。这是一套与中

upload_max_filesize,默认值是2MB的。但它仍然不能保证你的脚本将不会转交了尺

寸较大的文件。危险的是,攻击者将尝试向您发送一个请求几个大文件,并填写了文

件系统,也就是PHP存储解码文件。设置在php.ini的post_max_size的指令文件的最大

尺寸,你要(必须大于中upload_max_filesize)。默认值为10MB的。此指令控制的所

有要求,在一个允许的POST数据最大大小。另外,还要确保在你的php.ini文件

file_uploads设置为On。

至少,有一个在输入标记属性看:类型=“文件”。它是用来指定为文件选择控制输入

元素。这提供了一个文件的URI的地方,则需要键入一个“浏览”按钮,可作为替代的

URI输入使用。

在用户进入一个文件的URI,并点击提交按钮的文件的副本将被发送到服务器和用户将

被重定向到upload.php。此PHP文件将处理表单数据。

返回页首

处理表单数据(PHP代码)

当文件被上传和PHP创建了一个文件的临时副本,并建立了超全局变量$ _FILES数组,

包含有关文件的信息。对于每个文件,有5个数据。我们已上传字段命名

为'uploaded_file',所以会存在以下数据:

变量$ _FILES [“uploaded_file”] [“name”]从用户的机器上载的文件的原名称
变量$ _FILES [“uploaded_file”] [“type”]的上传文件的MIME类型(如果浏览器

提供的类型)
变量$ _FILES [“uploaded_file”] [“size”]的以字节为单位上传的文件大小
变量$ _FILES [“uploaded_file”] [“tmp_name”],在该文件暂时存储在服务器上

的位置
变量$ _FILES [“uploaded_file”] [“error”]错误代码从文件上传结果
下面的例子接受一个上传的文件并保存在上载目录中。它允许根据350Kb上传只有JPEG

图像。该代码本身,是相当清楚的,但我们会作出一些解释。有一个例子在外观和保

存此为upload.php PHP代码。
<?php
//Сheck that we have a file
if((!empty($_FILES["uploaded_file"])) && ($_FILES['uploaded_file']['error']

== 0)) {
//Check if the file is JPEG image and it's size is less than 350Kb
$filename = basename($_FILES['uploaded_file']['name']);
$ext = substr($filename, strrpos($filename, '.') + 1);
if (($ext == "jpg") && ($_FILES["uploaded_file"]["type"] == "image/jpeg")

&&
($_FILES["uploaded_file"]["size"] < 350000)) {
//Determine the path to which we want to save this file
$newname = dirname(__FILE__).'/upload/'.$filename;
//Check if the file with the same name is already exists on the

server
if (!file_exists($newname)) {
//Attempt to move the uploaded file to it's new place
if ((move_uploaded_file($_FILES['uploaded_file']

['tmp_name'],$newname))) {
echo "It's done! The file has been saved as: ".$newname;
} else {
echo "Error: A problem occurred during file upload!";
}
} else {
echo "Error: File ".$_FILES["uploaded_file"]["name"]." already

exists";
}
} else {
echo "Error: Only .jpg images under 350Kb are accepted for upload";
}
} else {
echo "Error: No file uploaded";
}
?>
在此之前的上载您需要的文件,以确定文件是否真的上传任何东西。之后我们检查上

传的文件,JPEG图像,其大小小于350Kb的。接下来,我们确定的道路,这是我们要保

存此文件,并检查是否已经存在一个服务器上的这些文件的名称。当所有检查通过,

我们将文件复制到一个永久的位置使用move_upload_file()函数。此功能也证实该

文件你要过程,是一个合法的文件从用户上传结果。如果该文件上传成功,那么相应

的消息将出现。

注意:要确保PHP已经允许读取和写入临时文件中保存的位置是您要复制文件的目录。

这个例子其实很简单,它的提出是为了演示如何使用PHP上传文件。例如,您可以添加

新的条件,并允许上传GIF和PNG图像,或任何文件,您需要其他种类。如果您是本教

程使用PHP不熟悉可能是一个很好的起点。

<input type="file" name="浏览" id="浏览" value="浏览">
这个地方改为:
<input type="file" name="file" id="file" value="浏览">
试试

你这个结果是上传成功了的啊,文件信息都明确的告诉你了,你在程序里面处理就可以了。
Array ( [name] => http_imgload1.jpg [type] => image/pjpeg [tmp_name] => C:\\WINDOWS\\Temp\\php1D5.tmp [error] => 0 [size] => 39205 )
name: 文件的原名字和格式
type:文件的meta值
tmp_name:文件上传后存在服务器的绝对路径,你可以用copy函数把文件复制到你想要存放的目录里面
size:文件的大小,单位是字节


我也是刚刚遇到了你的问题。找到了一段参考资料,希望能对你有所帮助。

  Windows和Linux的编码是不一样的,在Windows环境下,调用PHP的函数时参数如果是utf-8编码会出现错误,比如 move_uploaded_file()、filesize()、readfile()等,这些函数在处理上传、下载时经常会用到,调用时可能会出现下面的错误:
  
  Warning: move_uploaded_file()[function.move-uploaded-file]:failed to open stream: Invalid argument in ...
  
  Warning: move_uploaded_file()[function.move-uploaded-file]:Unable to move '' to '' in ...
  
  Warning: filesize() [function.filesize]: stat failed for ... in ...
  
  Warning: readfile() [function.readfile]: failed to open stream: Invalid argument in ..
  
  在Linux环境下用gb2312编码虽然不会出现这些错误,但保存后的文件名出现乱码导致无法读取文件,这时可先将参数转换成操作系统识别的编码,编码转换可用mb_convert_encoding(字符串,新编码,原编码)或iconv(原编码,新编码,字符串),这样处理后保存的文件名就不会出现乱码,也可以正常读取文件,实现中文名称文件的上传、下载。


HP5000打印机,文件已经上传完,卡在那里打印机也没反应一会就提示...
你看打印机报得什么错,多半是打印机卡纸,甚至没纸,盖子没盖好,之类的 自己看下 是在搞不定 打8008103888

Windows蓝牙无法传输某些文件看这里
在您的电脑上,选择“开始” > “设置” > “设备” > “蓝牙和其他设备”。确保将发送文件的设备出现并显示为已配对。在蓝牙和其他设备设置中,选择通过蓝牙发送或接收文件>接收文件。如果您仍然无法接收文件,您可以从您的电脑中删除该设备并重新连接,然后重试。

HP 1008 打印机 错误打印
要卸载驱动你得先把打印文件取消掉先才行!错误打印正常造成这种原因有可能是:1.驱动不符合这部机器 2.驱动安装时端口选择错误(现在大多为USB口)3.USB数据线损坏造成无法传输!4.打印机出错!比如卡纸,无粉、无墨等。5.电脑或者打印机的端口损坏 ...

HP打印机提示错误,正在打印怎么解决???
1、打印机在打印时出现打印错误,不能打印了,这时候应该选择先关闭打印机。2、关闭打印机之后,开始在电脑上进行操作。3、点击电脑左下方的Windows按钮。4、在如图所示地方输入:services.msc。5、点击services.msc打开。6、弹出服务对话框。7、Print Spooler程序。8、点击停止此服务。9、右键点击此程序...

安装惠普打印机时在划分文件时安装失败怎么解决
请问hp打印机的完整型号是什么?安装驱动的电脑是什么系统的?打印机和电脑是如何连接的?具体的报错界面能上传看一下吗?请提供上面的信息,可以追问。可以重新运行光盘或是到hp官网上下载最新版驱动安装试下。

在其他电脑上传在优盘上的文件,在另一个电脑上就不显示,文件包也删不...
听我的没错!启动WinRAR 这个解压缩文件然后调出优盘盘符 用解压缩打开 它的根目录下,找到Autorun.inf文件,点右键查看,看看里边是否写着Auto.exe如果是的话找到根目录下的Auto.exe点右键删除,然后在把 Autorun.exe删除 OK。但如果不行的话你的电脑感染病毒,杀毒或做系统 由于文件系统变为RAW,这种...

惠普驱动安装不上原因及解决方法
您好,1可能是安装驱动步骤错了,下载驱动的步骤一定要按步骤检查安装2可能是驱动程序兼容性问题,或驱动程序损坏,建议使用驱动管理软件安装,这样简单,而且是最新的,兼容性稳定性好3可能是打印机未连接电脑;可参照以下的方法进行解决由于电脑配置以设置的差异,打印机的类型的多样型,导致出现打印机驱动...

我的惠普电脑开机显示AccelerometerSt.exe应用程序错误,应用程序无法...
出现这种情况可能是硬件的问题,也可能是软件的问题。如果是硬件的问题,那么更换硬件就可以了。一、其实最简便的方法还是一键修复,使用DirectX修复工具。二、首先打开软件,找到“DirectX Repair.exe”文件,点击它。三、点击“检测并修复”,然后程序会开始自动修复。

惠普打印机校准未完成什么意思
根据查询相关信息显示,惠普打印机每当打印的时候,都会进行监控程序校准命令,如出现故障或程序错误,就会出现打印机校准未完成,需要尝试重启或找客服了解解决办法。请检查如下设置:确认是否安装了文件和打印机共享服务组件。要共享本机上的文件或打印机,必须安装Microsoft网络上的文件与打印机共享服务。确认...

添加打印机的时候总出现所需文件的框框,怎样能把打印功能解决啊,大侠赐 ...
重新下载HP P1006或P1007的官方驱动,不过有时候官方下载的驱动程序,还是无法识别,依然不不能识别P1006CLP.dll的文件,就算下载了这个文件,还是提示缺少一些其他文件。以前有个包包含了缺少的所有文件,不过不好上传= =或者你留个邮箱我传你 你再试试。

抚顺市15112578335: PHP 上传文件错误常见问题和解决方法 -
康魏迪北: 注意表单的Form标签中一定要添加 enctype=”multipart/form-data”文件才能上传.你在后台php页面输出看看F_ILE看看能不能接收到值.

抚顺市15112578335: php上传后报错该如何修改 -
康魏迪北: 找到该文件并且将该文件的权限修改为“可写”,若是在unix系统下,请使用相关命令来修改文件属性,给个关键词吧:chmod 、chown

抚顺市15112578335: php中关于文件上传的问题 出现错误 -
康魏迪北: 提示你上传的文件不能移动到你想到的文件夹.看提示要是要移动到的路径不对.你仔细看一下:photo\C:\wamp\tmp\php70DF.tmp 这个路径是不对的.

抚顺市15112578335: PHP文件上传报错, -
康魏迪北: 你把变量都var_dump 出来就知道哪错了目前的代码完全没问题

抚顺市15112578335: php文件上传老失败 -
康魏迪北: 下面代码中的upfile应该修改为filej:<?php$uploaddir="./uploaddir/";$uploadfile=$uploaddir.$_FILES['upfile']['name'];if(move_uploaded_file($_FILES['upfile']['tmp_name'],$uploadfile))修改为:<?php$uploaddir="./uploaddir/";$uploadfile=$uploaddir.$_FILES['filej']['name'];if(move_uploaded_file($_FILES['filej']['tmp_name'],$uploadfile))

抚顺市15112578335: php 上传文件出错 - --问题纠结的很!
康魏迪北: 那你重启服务器没,修改设置后需要重启动

抚顺市15112578335: 大家看看我用php写得文件上传代码,为什么系统给我这样一个错误“具体错误见下”(高手帮忙看看!) -
康魏迪北: $uploadRoot='./uploads/';设置上传目录 -> $uploadRoot='./uploads/';//设置上传目录print_r<$_FILES[>; -> print_r($_FILES);echo"<img src="'.$fileSaved.'">"; -> echo"<img src='" . $fileSaved . "'>";

抚顺市15112578335: php上传多个文件为什么出错? -
康魏迪北: <?php //刚才的代码有点错误,现在改正了一下并测试通过 $FILES = $_FILES['name1']; //取得上传的文件数组 $Nums = count($FILES['name']); //计算有多少个上传对象 $Wei = $_SERVER['DOCUMENT_ROOT'].'/up'; //设置文件保存路径 is_...

抚顺市15112578335: php上传代码 没反应 -
康魏迪北: if( $submit )改为if($_POST['submit']) 或者 在php.ini中设置register_globals = On,在重启apache或者IIS就可以了 register_globals叫做自动全局变量,服务器会把$_GET,$_POST,$_COOKIE等中的值自动加到全局变量里,例如 URL是a.php?c1=2...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网