PHP move_uploaded_file() 错误?
Posted
技术标签:
【中文标题】PHP move_uploaded_file() 错误?【英文标题】:PHP move_uploaded_file() error? 【发布时间】:2011-03-30 22:15:28 【问题描述】:我使用以下代码,它成功地在我的本地机器上上传文件。它在我的本地机器上显示“上传成功”。
// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );
if( $moved )
echo "Successfully uploaded";
else
echo "Not uploaded";
但是当我在我的在线服务器上使用此代码时,它不会上传文件,只是显示消息“未上传”。
我如何知道问题出在哪里,如何才能将实际问题显示给用户?
【问题讨论】:
网络服务器上有图片文件夹吗?该文件夹是只读的,还是可以写入? 因为FileZilla可以写这个目录,不代表你的web服务器也可以写。 没有。您应该阅读错误消息并解决问题。 “如何”是另一个问题。可以回答的。但是您必须了解非常基本的规则:没有错误消息,您就是盲人,聋子和哑巴。你唯一的愿望和努力应该是得到错误信息。我够清楚了吗? 程序员不应该信任。不是对说了些什么的客户,也不是来自 SO 的志愿者,也不是他自己。但只有程序员可以信任的错误消息。 【参考方案1】:修改代码如下:
// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );
if( $moved )
echo "Successfully uploaded";
else
echo "Not uploaded because of error #".$_FILES["file"]["error"];
它将为您提供以下错误代码值 1 到 8 之一:
UPLOAD_ERR_INI_SIZE = 值:1;上传的文件超过了 php.ini 中的 upload_max_filesize 指令。
UPLOAD_ERR_FORM_SIZE = 值:2;上传的文件超出了 html 表单中指定的 MAX_FILE_SIZE 指令。
UPLOAD_ERR_PARTIAL = 值:3;上传的文件只上传了一部分。
UPLOAD_ERR_NO_FILE = 值:4;没有上传文件。
UPLOAD_ERR_NO_TMP_DIR = 值:6;缺少一个临时文件夹。在 PHP 5.0.3 中引入。
UPLOAD_ERR_CANT_WRITE = 值:7;无法将文件写入磁盘。在 PHP 5.1.0 中引入。
UPLOAD_ERR_EXTENSION = 值:8; PHP 扩展停止了文件上传。 PHP 不提供确定是哪个扩展名导致文件上传停止的方法;使用 phpinfo() 检查加载的扩展列表可能会有所帮助。
【讨论】:
什么是错误 5? @Dan 根据 php manual ,错误 5 没有记录。个人没遇到过。【参考方案2】:试试这个:
$upload_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/";
if (is_dir($upload_dir) && is_writable($upload_dir))
// do upload logic here
else
echo 'Upload directory is not writable, or does not exist.';
这将立即标记任何文件权限错误。
【讨论】:
表示“上传目录不可写,或不存在。”怎么解决的,请解释一下? @SignoffTeamz 使上传目录可写,如果不存在则创建。 在 Linux 中使用 chmod/chown 来获取文件权限在 Web 开发教程中没有得到足够的介绍。我发现 776(不是最佳实践,最像 775)解决了大多数权限问题。将 -R 选项与 chmod 一起使用,以确保将权限传递给目录和目录中的文件。如果使用 apache2,Chown 应该将 www-data 作为所有者组,并将您的用户名作为所有者。您应该将自己添加到用户组 www-data,以便在该文件夹中继承来自服务器的权限以进行测试。【参考方案3】:检查网络服务器是否有权限写入“images/”目录
【讨论】:
我可以使用FileZilla手动上传此文件夹中的文件,这意味着它有权限。还有其他可能吗? FileZilla 不能证明 Web 服务器有权限。 Web 服务器很可能在与您不同的用户下运行。要确保它有权限,只需将权限设置为 777,然后测试。这应该证明是权限问题还是其他问题。 上传了 2 mb 的文件但没有上传 5 mb 的文件时发生了什么?这两个文件都是文件的pdf类型。那么如何从服务器获取确切的错误消息。所以我们可以知道确切的问题。 所以我检查了 phpinfo 函数,其中 upload_max_filesize 为 2mb,所以我认为这可能是问题,所以我会增加大小并再次检查【参考方案4】:我怎么知道问题出在哪里
简单。参考网络服务器的错误日志。
如何才能将实际问题显示给用户?
永远不要这样做。 普通用户对此错误一无所知。 恶意用户不应该得到任何反馈,尤其是信息量很大的错误消息。
只显示一个带有借口的页面。
如果您无权访问服务器的错误日志,您的任务会变得更加复杂。 有几种方法可以与错误消息取得联系。
要在屏幕上显示错误消息,您可以将这些行添加到代码中
ini_set('display_errors',1);
error_reporting(E_ALL);
或制作自定义错误日志文件
ini_set('log_errors',1);
ini_set('error_log','/absolute/path/tp/log_file');
还有其他一些方法。 但是您必须了解,如果没有实际的错误消息,您将无法移动。在黑暗中很难失明
【讨论】:
嗯,在开发站点上显示错误是可以的。并非总是可以将错误重定向到日志文件(例如在共享主机上)。 @Pekka 我们说的是现场自动取款机。而且,老实说,应该立即放弃这样的托管。【参考方案5】:move_uploaded_file()
将返回:
FALSE
如果文件名无效
FALSE
和 issue a warning
如果 apache 进程没有对源或目标目录的读/写权限,则在错误日志中
PHP 错误日志
我的 php 错误日志位于:/var/log/httpd/error_log
并出现以下错误:
警告:move_uploaded_file(images/robot.jpg):无法打开流:第 78 行 /var/www/html/mysite/mohealth.php 中的权限被拒绝
警告:move_uploaded_file(): Unable to move '/tmp/phpsKD2Qm' to 'images/robot.jpg' in /var/www/html/mysite/mohealth.php on line 78
move_uploaded_file()
尝试将文件从临时目录移动到目标目录。当 apache 进程试图移动文件时,它无法读取临时目录或写入目标目录。
查找正在运行 Apache(Web 服务器)的用户
通过此命令检查哪个用户正在运行 apache 服务:ps aux | grep httpd
。第一列是用户名。
检查临时目录的读取权限:您可以通过在 php 页面中调用 echo sys_get_tmp_dir();
来找到临时目录的路径。然后在命令行发出ls -ld /tmp/temporary-dir
,看看apache用户是否有权限阅读这里
检查目标目录的写入权限: issue ls -ld /var/www/html/destination-directory
以查看 apache 用户是否有权在此处写入
根据需要使用chown
或chgrp
添加权限
重启 Apache 使用 sudo service httpd restart
【讨论】:
如何在windows中查看用户? 问题已通过关键字“source”解决。看一下:“如果 apache 进程没有对‘源’或目标目录的读/写权限,move_uploaded_file() 将返回 FALSE 并在错误日志中发出警告。”因此,仅授予项目目录的所有权限是不够的,还应授予源文件位置的所有权限。【参考方案6】:您检查文件是否上传正常?也许您超过了 max_post_size 或 max_upload_filesize。使用 FileZilla 登录时,您正在复制文件,当通过 PHP wiritng 上传此文件来自运行 apache(例如 www-data)的用户时,请尝试将 chmod 755 用于图像。
【讨论】:
【参考方案7】:或运行 suexec 并且永远不必再次更改权限。
【讨论】:
【参考方案8】:在 php.ini
中搜索 upload_max_filesize 和 post_max_size。我遇到了同样的问题,解决方案是将这些值更改为大于文件大小的值。
【讨论】:
【参考方案9】:请检查您的form
标签是否具有此属性:
enctype="multipart/form-data"
【讨论】:
【参考方案10】:$uploadfile = $_SERVER['DOCUMENT_ROOT'].'/Thesis/images/';
$profic = uniqid(rand()).$_FILES["pic"]["name"];
if(is_uploaded_file($_FILES["pic"]["tmp_name"]))
$moved = move_uploaded_file($_FILES["pic"]["tmp_name"], $uploadfile.$profic);
if($moved)
echo "sucess";
else
echo 'failed';
【讨论】:
【参考方案11】:在虚拟主机上检查您的disk quota
。
如果超过配额,move_uploaded_file
返回错误。
PS : 我找这个很久了:)
【讨论】:
【参考方案12】:请检查权限“images/”目录
【讨论】:
【参考方案13】:我遇到了错误 6 的一个非常晦涩和烦人的原因。 在玩弄了一些 NFS 挂载的卷之后,上传开始失败。 问题通过重启服务解决
systemctl restart php-fpm.service
systemctl restart httpd.service
【讨论】:
以上是关于PHP move_uploaded_file() 错误?的主要内容,如果未能解决你的问题,请参考以下文章
使用 move_uploaded_file() 时如何在 PHP 中创建目标(文件夹)?