-1

我有一个表单,用于在此表单中将文章上传到我的数据库我有一个文件上传字段,我的文件上传目标如下:

  1. 将文件扩展名限制为图像格式
  2. 将文件重命名为随机的东西
  3. 根据条目的ID创建一个新目录进入数据库
  4. 保留上传文件的扩展名

每次我点击提交按钮时,表单似乎认为我已尝试上传不在允许扩展名列表中的文件,它会打印此错误(但字段已上传到数据库):

wrong files format , allowed only "Array"

我不太清楚为什么会这样,因为我知道我输入了正确的文件格式。

    public function insert ($field) {

            if ($stmt = $this->mysqli->prepare("INSERT INTO articles (title, story, storyb, storyc, author, date_created, section, youtubeid) VALUES (?, ?, ?, ?, ?, ?, ?, ?)")) {

                        /* Set our params */

                         $title = isset($_POST['title']) ? $this->mysqli->real_escape_string($_POST['title']) : '';
                         $story = isset($_POST['story']) ? $this->mysqli->real_escape_string($_POST['story']) : '';
                         $storyb = isset($_POST['storyb']) ? $this->mysqli->real_escape_string($_POST['storyb']) : '';
                         $storyc = isset($_POST['storyc']) ? $this->mysqli->real_escape_string($_POST['storyc']) : '';
                         $author = isset($_POST['author']) ? $this->mysqli->real_escape_string($_POST['author']) : '';
                         $date_created = isset($_POST['date_created']) ? $this->mysqli->real_escape_string($_POST['date_created']) : '';
                         $section = isset($_POST['section']) ? $this->mysqli->real_escape_string($_POST['section']) : '';
                         $youtubeid = isset($_POST['youtubeid']) ? $this->mysqli->real_escape_string($_POST['youtubeid']) : '';

                        /* Bind our params */
                        $stmt->bind_param('ssssssss', $title, $story, $storyb, $storyc, $author, $date_created, $section, $youtubeid);

                        /* Execute the prepared Statement */
                        $stmt->execute();

                        /* Echo results */
                        echo "Inserted {$title} into database\n";

                        /* Close the statement */
                        $stmt->close();
                        }
                        else {
                        /* Error */
                        printf("Prepared Statement Error: %s\n", $mysqli->error);
                        }

            // Handling file upload

            $extensions = array(".jpg",".jpeg",".gif",".png", ".JPG", ".JPEG", ".PNG", ".GIF");
            $extension = strrchr($_FILES['uploadImage']['name'], '.');

            $path =  "../files/uploads/articles_gallery/" . $this->mysqli->insert_id;
            $filename = uniqid(rand(), true);            


                if (!in_array($extension, $extensions))
                    {
                        echo'<center>wrong files format , allowed only <strong>"'.$extensions.'"</strong></center>';
                    }  else {

                            if (!is_dir($path))
                          {
                            die('Error: ' . $mysqli->error());
                          }

                                    echo "<h3>1 record added</h3>";
                                    mkdir($path, 0777);
                                    move_uploaded_file($_FILES['uploadImage']['tmp_name'], $path, $filename);
                    } // File Upload End

        }

插入.php

<div id="form">
<form action="insert.php" method="post" name="insert" id="articleform">
            <input type="input" name="title" id="title" class="detail" id="title"/>
            <textarea name="story" id="story" class="detail" placeholder="Insert article here"></textarea>
            <input id="uploadImage" type="file" name="uploadImage" onchange="PreviewImage();" class="" />
    <img id="uploadPreview" style="width: 250px; height: 200px;" />
            <textarea name="storyb" id="storyb" class="detail" spellcheck="true" placeholder="Insert article here"></textarea>        
            <textarea name="storyc" id="storyc" class="detail" spellcheck="true" placeholder="Insert article here"></textarea>
            <input type="input" name="author" id="author" class="detail"/>
            <? $today = date("l j M Y");  // Monday 13 April 2013 ?>
    <input type="hidden" name="date_created" id="date_created" class="detail" value="<? echo $today;?>" />            
            <input type="hidden" name="section" id="section" class="detail" value="game"/>           
            <input type="input" name="youtubeid" class="detail" id="youtubeid" />
            <input type="submit" id="submit" name="submit" value="Submit Article    " />
        </form>
4

4 回答 4

0

从以下位置更新您的表格:

<form action="insert.php" method="post" name="insert" id="articleform">

至 :

<form action="insert.php" method="post" name="insert" id="articleform" enctype="multipart/form-data">
于 2013-04-17T13:25:16.813 回答
0

如果字符串中存在字符(在您的情况下为“.”),strchr()将为您提供真/假。因此,要获取文件扩展名,您可以使用以下内容:

$extension = end(explode('.', $filename));

.. 但也许像pathinfo()这样的函数在这种情况下也很有用。

此外,在您的错误消息中,您使用$extensions. 这是一个类型为“array”的 var,因此字符串表示为“Array”。我想你$extension的意思是(没有 S)那里。或者,也许您想以这种方式列出所有正确的扩展名:implode(',', $extensions).

请注意,检查扩展程序并不是检查存在何种内容的安全方法。我可以轻松上传 .exe,只需将其重命名为 .jpg。

哦,出于安全原因,强烈建议不要将目录/文件 chmod 到模式 777。

于 2013-04-17T13:28:57.343 回答
0

如果您想显示可用的扩展名,您不能只将您的数组与您的消息连接起来。您必须迭代所有值。

于 2013-04-17T13:29:06.663 回答
0

获取扩展名的代码是错误的。

$extension = strrchr($_FILES['uploadImage']['name'], '.');

将其更改为

$extension = strtolower(substr($_FILES['uploadImage']['name'],-3,3));

如果扩展名是 3 个字符长或explode() 并获取最后一个参数。无论如何这不是好方法,我更喜欢检查 MIME 类型

$extension = strtolower(end(explode('.', $_FILES['uploadImage']['name'])));

将您的扩展数组更改为

$extensions = array("jpg","jpeg","gif","png");

也添加到您的表格

enctype="multipart/form-data"

您的错误消息是错误的,因为您想回显数组而不是字符串使用 implode() 加入数组

implode(";",$extensions)
于 2013-04-17T13:29:07.633 回答