【问题标题】:Cant upload image file using php无法使用php上传图像文件
【发布时间】:2024-01-01 19:22:01
【问题描述】:

这条线呢?

警告:copy():open_basedir 限制生效。 File() 不在允许的路径内:(/xxx/xxx/xxx/xxx/php:/tmp) in /home/xxxxxxxxxx/public_html/newsp.php 第 85 行

这是我的代码:

<?php
 session_start();
 if (isset($_SESSION['password'])) {
        $con=mysqli_connect("xxxxx","xxxxx","xxxxx","xxxxx");
        // Check connection
            if (mysqli_connect_errno($con))
            {
            echo "Failed to connect to MySQL: " . mysqli_connect_error();
            }
            $result = mysqli_query($con,"SELECT * FROM News ORDER BY ID DESC LIMIT 1");

            while($row = mysqli_fetch_array($result))
                {
                    $ID = $row['ID'] + 1;
                }

            $title = $_POST['title'];
            $content = $_POST['content'];
            $type=$_POST['type'];

            echo $title . "<br>";
            echo $content . "<br>";
            echo $type . "<br>";
            echo $ID . "<br>";

            $sql = 'INSERT INTO News '.'(Title, Content, Type) '.'VALUES ( $title, $content, $type)';
            $result=mysqli_query($con,$sql);

//define a maxim size for the uploaded images in Kb
 define ("MAX_SIZE","100"); 

//This function reads the extension of the file. It is used to determine if the file  is an image by checking the extension.
 function getExtension($str) {
         $i = strrpos($str,".");
         if (!$i) { return ""; }
         $l = strlen($str) - $i;
         $ext = substr($str,$i+1,$l);
         return $ext;
 }

//This variable is used as a flag. The value is initialized with 0 (meaning no error  found)
//and it will be changed to 1 if an errro occures.
//If the error occures the file will not be uploaded.
 $errors=0;
//checks if the form has been submitted
    //reads the name of the file the user submitted for uploading
    $image=$_FILES['file']['name'];
    //if it is not empty
    if ($image)
    {
    //get the original name of the file from the clients machine
        $filename = stripslashes($_FILES['file']['name']);
    //get the extension of the file in a lower case format
        $extension = getExtension($filename);
        $extension = strtolower($extension);
    //if it is not a known extension, we will suppose it is an error and will not  upload the file,
    //otherwise we will do more tests
        if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif"))
            {
            //print error message
            echo '<h1>Unknown extension!</h1>';
            $errors=1;
            }
        else
        {
    //get the size of the image in bytes
     //$_FILES['image']['tmp_name'] is the temporary filename of the file
     //in which the uploaded file was stored on the server
     $size=filesize($_FILES['image']['tmp_name']);

    //compare the size with the maxim size we defined and print error if bigger
        if ($size > MAX_SIZE*1024)
            {
            echo '<h1>You have exceeded the size limit!</h1>';
            $errors=1;
            }

    //we will give an unique name, for example the time in unix time format
        $image_name= $ID.'.'.$extension;
    //the new name will be containing the full path where will be stored (images folder)
        $newname="NewsPic/".$image_name;
    //we verify if the image has been uploaded, and print error instead

        echo $image_name;
        $copied = copy($_FILES['image']['tmp_name'], $newname);
        if (!$copied)
            {
            echo '<h1>Copy unsuccessfull!</h1>';
            $errors=1;
            }


        }
    }




    } else {
        header("location:login.php");
    }
?>

我想上传一张图片到我的文件夹。

【问题讨论】:

  • 不要只信任扩展。尝试验证上传的文件实际上是 jpg/gif/png。
  • 确认你是否有写文件夹的权限
  • 我只想为 jpg 制作它。我该怎么做?
  • 使用$_FILES['image']['type']获取扩展
  • 试试这个 move_uploaded_file($_FILES['image']['tmp_name'],$newname) 而不是 copy() 函数

标签: php database image file warnings


【解决方案1】:

尝试使用move_uploaded_file(param1,param2);函数

move_uploaded_file($_FILES['image']['tmp_name'],$newname)

注意:你的变量 $newname 必须包含你应该保存它的文件夹的路径 + 文件名


供您的INSERT查询

在声明应插入的字段时尝试同时删除 '.'

产生这样的查询

$sql= "INSERT INTO News(Title, Content, Type)VALUES ( '$title', '$content', '$type')";

因为'.' 使你的sql 失败。

【讨论】:

  • 谢谢,你能帮我看看我的“插入”有什么问题吗?因为我上传了图像但没有记录在我的数据库中。
  • 删除 '.' 导致您的查询是这样的 INSERT INTO News (Title, Content, Type) VALUES ( $title, $content, $type) .. 顺便问一下它的用途是什么?
  • 尝试删除它并运行查询,因为这会导致您的查询失败。
  • mysqli_query($con,"插入新闻(标题,内容,类型)值($title,$content,$type)");仍然..不工作。