【问题标题】:PHP uploading multiple images and inserting into databasePHP上传多张图片并插入数据库
【发布时间】:2014-03-18 07:03:20
【问题描述】:

我希望用户能够上传多张图片。有没有办法在数据库的一个字段下存储 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";
   } 
  }
 }

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

【问题讨论】:

  • 使用 var_dump() 或 print_r() 了解您在 $_FILES 变量中的确切内容
  • 逗号或管道分隔的值会为你做这件事..确保在你想使用它时解析它
  • move_uploaded_file($fileTmp, $fileDst)) ?
  • print_r($fileDst);只给我一个图像路径。

标签: php


【解决方案1】:

一次性上传所有图片:

<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
        }

【讨论】:

  • 但是这样你可以从浏览窗口一次选择多个,因为我希望用户手动一个一个地上传
  • 比有多个输入 type=file.. 它没有变得更简单
  • 好吧,我想我可以这样做,并且有一个添加更多按钮,我只是隐藏输入的重置并在每次点击时一一添加对吗?
  • 好吧,这似乎行得通。现在一旦它们在数据库中,我就像这样调用它们 并循环直到全部加载?
  • naaa..您需要解析您存储的字符串..因为您在一个字段中存储了多个文件名。因此,当您获取字符串时...explode() 带有分隔符的字符串。 .并将其存储在一个数组中。然后循环遍历它
【解决方案2】:

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

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

无需提供索引。只需提供数组符号 [] 即可。您的问题是您为第一个动态文件提供了 2 的索引。所以文件数组索引变为0、2、3等,所以循环将无法正确迭代。

【讨论】:

  • 当我做 print_r($fileDst);我只有一个图像路径
  • 第一个文件元素的索引是 0。然后下一个必须是 1。但是根据你的 jquery,你给它 2。然后在你的 for 循环条件中,第二次迭代变为 false。所以只上传了一张图片
【解决方案3】:

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

至少有3种方法可以做到:

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

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

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

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

所以使用一些“user_images”表会更方便。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 2023-04-11
      • 2016-03-02
      相关资源
      最近更新 更多