将多个图像上传到数据库MYSQLI

时间:2014-12-21 12:07:51

标签: php html mysql database

我打算建一个网络图库。但是,我很难使用PHP来插入数据库。以下代码:

HTML - 我想创建一个包含类别和多个图像的表单,这些图像可以同时插入到数据库中。

<form action="upload" method="POST" enctype="multipart/form-data">
    <p> Upload : <input type="file" id="file" name="images" /> </p>
    <p> Category : <input type="text" name="imageCategory"> </p>
    <p> <input type="submit" name="submit" value="Upload!" /> </p>
</form>

数据库

I am using imageName as VARCHAR not BLOB TYPE.

PHP

<?php
include ("dbConnect.php");

    if(isset($_POST["submit"])) {

        $image = $_POST['images']['tmp_name'];
        $imageName = $_POST['images']['name'];
        $imageSize = $_POST['images']['size'];
        $imageType = $_POST['images']['type'];
        $imageCategory = $_POST['imageCategory'];

        $result =   $mysqli->query("INSERT INTO imageTable (imageName, imageCategory, imageSize, imageType) 
                                  VALUES ('$imageName', '$imageCategory', '$imageSize' , '$imageType' );")

                    or die(mysqli_error($mysqli));

    } else {

        echo "<p> It is not working </p>";

    }

    header("location: index"); 

    $mysqli->close();
?>

问题是,该类别是唯一一个已成功插入数据库的类别。但不是imageName,imageType和imageSize。而且我还希望将图像存储到数据库中,以便我可以从其他网页上的数据库中检索图像。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以在'input'标记中使用'multiple'属性,如下所示:

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Send these files:<br />
  <p> <input name="userfile[]" type="file" multiple='multiple' /> </p>
  <p> Category : <input type="text" name="imageCategory"> </p>
  <input type="submit" value="Send files" />
</form>

用户可以选择多个文件并上传。 在服务器上,您将执行此操作:

if (isset($_FILES["userfile"]) && !empty($_FILES["userfile"])) {
        $image = $_FILES['userfile']['tmp_name'];
        $imageName = $_FILES['userfile']['name'];
        $imageSize = $_FILES['userfile']['size'];
        $imageType = $_FILES['userfile']['type'];
        $imageCategory = $_POST['imageCategory'];
        $len = count($image);
        $path = "images/";
        for ($i = 0; $i < $len; $i++) {
             if (isset($imageName[$i]) && $imageName[$i] !== NULL) {
                 if(move_uploaded_file($image[$i], $path.$imageName[$i])) {
                    $result = $mysqli->query("INSERT INTO imageTable (imageName, imageCategory, imageSize, imageType) VALUES ('$imageName[$i]', '$imageCategory', '$imageSize[$i]' , '$imageType[$i]' )");
                 }
             }
        }
}
$mysqli->close();
header("location: index"); 

答案 1 :(得分:0)

首先关闭文件信息不会在$ _POST全局变量中,它将在$ _FILES

来自http://php.net/manual/en/features.file-upload.multiple.php(已修改):

表格

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Send these files:<br />
  <p> <input name="userfile[]" type="file" /> </p>
  <p> <input name="userfile[]" type="file" /> </p>
  <p> Category : <input type="text" name="imageCategory"> </p>
  <input type="submit" value="Send files" />
</form>

将全局文件变量解析为数组(我们假设这是一个名为parseFiles.php的辅助函数):

<?php

function reArrayFiles(&$file_post) {

    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++) {
        foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
        }
    }

    return $file_ary;
}

移动文件并将文件信息插入数据库:

<?php

include ("dbConnect.php");
include ("parseFiles.php");

if ($_FILES['upload']) {
    $file_ary = reArrayFiles($_FILES['userfile']);

    foreach ($file_ary as $file) {

        $image = $file['tmp_name'];
        $imageName = $file['name'];
        $imageSize = $file['size'];
        $imageType = $file['type'];
        $imageCategory = $_POST['imageCategory'];

        $result =   $mysqli->query("INSERT INTO imageTable (imageName, imageCategory, imageSize, imageType) 
                                  VALUES ('$imageName', '$imageCategory', '$imageSize' , '$imageType' );")

                    or die(mysqli_error($mysqli));
    }

} else {

    echo "<p> It is not working </p>";

}

header("location: index"); 

$mysqli->close();

希望那应该做的工作。我没有测试过这个我只是盲目编码它所以可能有一些错误