PHP上传多个图像并插入数据库

时间:2014-02-14 06:32:02

标签: php

我希望用户能够上传多张图片。有没有办法在数据库中的一个字段下存储3个图像的路径?我的意思是让所有图像路径都在同一列中,如此

Images                                                     | date                                                                               
images/file1.jpg, images/file2.jpg, images/file3.jpg       | Thursday...

<ul id="image_upload">
    &lt;input type="file" name="image[]"&gt;&lt;a href="#" id="add_more">Add more</a> <br>
     [removed]
      $(document).ready(function(){
       $('#add_more').click(function(){
        var current_count = $('input[type="file"]').length;
        var next_count = current_count + 1;
        $('#image_upload').append('<br>&lt;input type="file" name="image[' + next_count + ']"&gt;&lt;br>');
       });
      });



    </ul> <br><br>

然后我用php检查文件并尝试插入数据库

if (!empty($_FILES['image'])){  
  for ($i = 0; isset($_FILES['image']['name'][$i]); $i++) {
   $allowed = array('jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif');
   $fileName = $_FILES['image']['name'][$i];
   $fileSize = $_FILES['image']['size'][$i];
   $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

   if (!in_array($fileExt, $allowed)) {
    $errors[] = 'Incorrect file type. Only allowed: ' . implode(', ', $allowed) . '';
   }
   if ($fileSize > 2097152) {
    $errors[] = "$fileName exceeds the maximum file size of 2 MB";
   }
  }

  for ($i = 0; isset($_FILES['image']['name'][$i]); $i++) {
   $fileBase = basename($_FILES['image']['name'][$i]);
   $fileName = pathinfo($fileBase, PATHINFO_FILENAME);
   $fileExt = pathinfo($fileBase, PATHINFO_EXTENSION);
   $fileTmp = $_FILES['image']['tmp_name'][$i];
   $fileDst = 'images/images/'.basename($_FILES['image']['name'][$i]);
   for ($j = 0; file_exists($fileDst); $j++) {
    $fileDst = "images/images/$fileName-$j.$fileExt";
   }
   if (move_uploaded_file($fileTmp, $fileDst)) {
    $output[$fileBase] = "Stored $fileBase OK";
   } 
  }
 }

此代码仅将第一个图像上传到临时文件夹,并且只将一个路径上传到数据库

4 个答案:

答案 0 :(得分:2)

一次上传所有图片:

<form method="post" action="" enctype="multipart/form-data" id="frmImgUpload">
    <input name="multiple_uploaded_files[]" type="file" multiple="true" />
</form>

foreach ($_FILES['multiple_uploaded_files']['name'] as $file)
    {
        print_r($file);
        //use the move_uploaded_file() to move your file on your server directory.

        //fire an insert query that inserts all the file names with comma separated value
    }

如果您希望用户逐个单独上传图像:

<input type="file" name="uploaded_file[]" id="file" >
<input type="file" name="uploaded_file[]" id="file" >
<input type="file" name="uploaded_file[]" id="file" >

foreach ($_FILES['uploaded_file']['name'] as $file)
        {
            print_r($file);
            //use the move_uploaded_file() to move your file on your server directory.
            //fire an insert query that inserts all the file names with comma separated value
        }

答案 1 :(得分:1)

您只需从动态文件元素中删除索引,如下所示:

$(document).ready(function(){
    $('#add_more').click(function(){
        $('#image_upload').append('<br><input type="file" name="image[]" />');
    });
});

无需提供索引。只提供一个数组符号[]。这里的问题是你给第一个动态文件索引2。因此文件数组索引变为0,2,3等,因此循环将无法正确迭代。

答案 2 :(得分:0)

如果您只想存储路径,我会看一下serialize()unserialize()。它们用于创建可存储的数据表示。

答案 3 :(得分:0)

  

有没有办法在数据库中的一个字段下存储3个图像的路径?

至少有3种方法:

  1. Serialize PHP数组在保存到您的数据库之前和unserialize之后选择。

  2. 将它们保存为带有一些分隔符的字符串(例如:path1 || path2 || pathX)。内爆和爆炸功能会有所帮助。

  3. 如果您使用的是PostgreSQL,则可以使用数组数据类型。因此,您将能够在SQL中对它们进行操作(计数,将其中一个更改为另一个等)。

  4. 但我认为这不是解决这个问题的更好方法。因为现在您只想保存路径,所以在几天之后您可能需要添加一些额外的数据,如ALT文本,标题,描述,大小,小预览路径等。

    所以使用一些&#34; user_images&#34;表会更方便。