PHP move_uploaded_file()错误?

时间:2010-08-17 11:12:05

标签: php file file-upload

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

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

if( $moved ) {
  echo "Successfully uploaded";         
} else {
  echo "Not uploaded";
}

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

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

13 个答案:

答案 0 :(得分:39)

编辑代码如下:

// 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()检查加载的扩展名列表可能会有所帮助。

答案 1 :(得分:37)

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

答案 2 :(得分:34)

试试这个:

$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.';
}

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

答案 3 :(得分:16)

  

我怎么知道问题是什么

易。请参阅网络服务器的错误日志。

  

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

从不这样做 普通用户不会对此错误一无所知 恶意用户不应该收到任何反馈,特别是以非常有用的错误信息的形式。

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

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

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

ini_set('display_errors',1);
error_reporting(E_ALL);

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

ini_set('log_errors',1);
ini_set('error_log','/absolute/path/tp/log_file');

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

答案 4 :(得分:5)

move_uploaded_file()将返回:

  1. FALSE如果文件名无效
  2. 如果apache进程没有对源或目标目录的读/写权限,则在错误日志中
  3. FALSEissue a warning
  4. PHP错误日志

    我的php错误日志位于:/var/log/httpd/error_log并出现以下错误:

      

    警告:move_uploaded_file(images / robot.jpg):无法打开流:第78行/var/www/html/mysite/mohealth.php中的权限被拒绝

         

    警告:move_uploaded_file():无法移动' / tmp / phpsKD2Qm'到' images / robot.jpg'在第78行的/var/www/html/mysite/mohealth.php

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

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

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

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

    4. 使用chownchgrp

    5. 根据需要添加权限
    6. 使用sudo service httpd restart

    7. 重新启动Apache

答案 5 :(得分:2)

你检查文件上传了吗?也许你超过了max_post_size或max_upload_filesize。使用FileZilla登录时,您正在复制文件,当通过PHP wiritng上传时,此文件来自运行apache的用户(对于exaplme www-data),尝试将chmod 755用于图像。

答案 6 :(得分:1)

或运行suexec,永远不必再次更改权限。

答案 7 :(得分:0)

请检查您的form标记是否具有此属性:

enctype="multipart/form-data"

答案 8 :(得分:0)

$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';
    }
}

答案 9 :(得分:0)

在虚拟主机上检查您的disk quota

如果配额超出,move_uploaded_file会返回错误。

PS:我一直在寻找这个问题:)

答案 10 :(得分:0)

请检查权限"图像/"目录

答案 11 :(得分:0)

我遇到了一个非常模糊和令人讨厌的错误原因6。 遍历了一些NFS挂载的卷之后,上传开始失败。 通过重启服务解决了问题

systemctl restart php-fpm.service
systemctl restart httpd.service

答案 12 :(得分:0)

php.ini中搜索 upload_max_size post_max_size 。我遇到了同样的问题,解决方案是将这些值更改为大于文件大小的值。