move_uploaded_file在PHP中不起作用

时间:2018-01-27 01:56:22

标签: php html file-upload permissions

我在使用move_upload_file函数时遇到了一些问题。我总是收到“上传无效”消息。这里是php和html代码。你们能看到一些错误吗? 上传目录是可写的,如下图所示。

ls -l command output ls -l command output

这里的PHP

        $tmp_dir = $_FILES['avatar']['tmp_name'];
        $imgSize = $_FILES['avatar']['size'];
        $upload_dir = '../../img/useravatar/';
        $userpic = hash("md5", time() . $imgFile) . "." . $imgExt;
        if ($imgSize < 5000000) {
            if (!is_writable($upload_dir))
                die("Permission denied when uploading file");
            if (move_uploaded_file($tmp_dir, $upload_dir . $userpic)) {
                //success
                die("Success");
            }else{
                //fail
                die("Upload not valid");
            }
        }else{
            redirect("../mainPages/signup.php", "Too large");
        }

这里的HTML

      <form class="form-signup" enctype="multipart/form-data"action="../submitPages/newUser.php" method = "post">
         <div class="form-group">
           <label for="avatar">Choose avatar</label>
           <input type="file" class="form-control-file" name="avatar" accept="image/*" id="avatar">
         </div>
         <button class="btn btn-lg btn-primary btn-block" type="submit">Sign Up</button>
      <form>

这里是var_dump($ _ FILES)

 array (size=1)
  'avatar' => 
    array (size=5)
     'name' => string 'IMG_20160725_134910.jpg' (length=23)
     'type' => string '' (length=0)
     'tmp_name' => string '' (length=0)
     'error' => int 1
     'size' => int 0

这里是ls -l命令

drwxrwxrwx 3 nicola nicola 4096 Jan 27 02:31 img
drwxrwxrwx 2 nicola nicola    4096 Jan 15 03:37 useravatar

编辑:它适用于.png img。

1 个答案:

答案 0 :(得分:2)

您需要将enctype="multipart/form-data"作为属性添加到<form>才能正确发送图片(您必须在发送任何<input type="file">项时添加此图片。)

所以你的<form>应该是这样的:

<form enctype="multipart/form-data" method="POST" action="path/to/PHPfile.php">
    <div class="form-group">
       <label for="avatar">Choose avatar</label>
       <input type="file" class="form-control-file" name="avatar" accept="image/*" id="avatar">
    </div>
    <input type="submit" value="submit" />
</form>

如果在设置了正确的编码类型后,它仍然无法正常工作,请尝试检查您指定的文件夹是否存在于该路径中(正确可能是./../img/useravatar/而不是../../img/useravatar/,等等。)

if(!file_exists("../../img/useravatar/")) echo 'no such directory';

修改

现在您发布了var_dump($_FILES)错误很明显。您上传的图像超出了php.ini中定义的最大大小限制。

  

PHP返回适当的错误代码以及文件数组。错误代码可以在PHP文件上载期间创建的文件数组的错误段中找到。换句话说,错误可能在$_FILES['userfile']['error']

中找到      

UPLOAD_ERR_INI_SIZE 值: 1 ;上传的文件超出了php.ini中的upload_max_filesize指令。

此处有关错误代码的更多信息:php.net/file-upload-errors

要在php.ini中正确设置值,您需要设置以下字段:

memory_limit = 32M             // size of post_max_size or greater        
// this is the size of the whole POST
post_max_size = 32M            // should be greater than upload_max_filesize
// this is max size per uploaded file
upload_max_filesize = 24M

或者,这些设置也可以应用于.htaccess

# this should be added at the bottom of the .htaccess file
php_value memory_limit 32M
php_value post_max_size 32M
php_value upload_max_filesize 24M