PHP move_uploaded_file()错误?

Awa*_*wan 32 php file-upload file

我使用以下代码,它成功上传本地计算机上的文件.它在我的本地计算机上显示"已成功上传".

// Upload file
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt" );

if( $moved ) {
  echo "Successfully uploaded";         
} else {
  echo "Not uploaded";
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在我的在线服务器上使用此代码时,它不上传文件,只显示消息"未上传".

我怎么知道问题是什么?如何才能将实际问题显示给用户?

小智 47

编辑代码如下:

// 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"];
}
Run Code Online (Sandbox Code Playgroud)

它将为您提供以下错误代码值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()检查加载的扩展名列表可能会有所帮助.

  • **将节省您的时间**阅读此答案! (2认同)

And*_*c ॐ 40

检查Web服务器是否有权写入"images /"目录

  • FileZilla不会证明Web服务器具有权限.Web服务器很可能在不同的用户下运行.要确保它具有权限,只需将权限设置为777,然后进行测试.这应该证明它是权限问题还是其他问题. (11认同)

Mar*_*ean 36

试试这个:

$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.';
}
Run Code Online (Sandbox Code Playgroud)

这将立即标记任何文件权限错误.

  • 显示为“上传目录不可写,或不存在”。怎么解决的,请解释一下? (2认同)
  • @SignoffTeamz 要么使上传目录可写,要么在它不存在时创建它。 (2认同)

You*_*nse 16

我怎么知道这是什么问题

简单.请参阅Web服务器的错误日志.

如何才能将实际问题显示给用户?

永远不要这样做.
普通用户不会对此错误一无所知.
恶意用户不应得到任何反馈,尤其是以非常有用的错误消息形式.

只是显示一个借口的页面.

如果您无法访问服务器的错误日志,则任务变得更加复杂.
有几种方法可以与错误消息联系.

要在屏幕上显示错误消息,您可以将这些行添加到代码中

ini_set('display_errors',1);
error_reporting(E_ALL);
Run Code Online (Sandbox Code Playgroud)

或者制作自定义错误日志文件

ini_set('log_errors',1);
ini_set('error_log','/absolute/path/tp/log_file');
Run Code Online (Sandbox Code Playgroud)

还有其他一些方法.
但你必须明白,如果没有实际的错误信息,你就无法移动.在黑暗中很难盲目

  • 好吧,在开发站点上显示错误是可以的。并非总是可以将错误重定向到日志文件(例如在共享主机上)。 (2认同)

Ali*_*eed 6

move_uploaded_file() 将返回:

  1. FALSE 如果文件名无效
  2. FALSEissue 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():无法在第78行的/var/www/html/mysite/mohealth.php中将'/ tmp/phpsKD2Qm'移动到'images/robot.jpg'

move_uploaded_file()尝试将文件从临时目录移动到目标目录.当apache进程尝试移动文件时,它无法读取临时文件或写入目标目录.

  1. 查找运行Apache的用户(Web服务器) 通过以下命令检查哪个用户正在运行apache服务:ps aux | grep httpd.第一列是用户名.

  2. 检查临时目录的读取权限:您可以通过echo sys_get_tmp_dir();在php页面中调用来查找临时目录的路径.然后在命令行上发出问题ls -ld /tmp/temporary-dir以查看apache用户是否有权在此处阅读

  3. 检查Destination Dir的写入权限:问题ls -ld /var/www/html/destination-directory是看看apache用户是否有权在此处写入

  4. 根据需要使用chown或添加权限chgrp

  5. 使用重启Apachesudo service httpd restart