来自多个上传表单的数组,上传图像然后插入数据库(PHP,MySQL)

时间:2012-06-25 18:28:43

标签: php mysql arrays forms file-upload

语言: PHP / MySQL

我想出去了,我现在真的要问...我有一个多文件上传表格:

<input type="file" name="fileupload[]" multiple>

在一些Javascript的帮助下,对此输入所做的每次更改,它会在另一个输入中附加一个文件名列表,+一个格式化的字符串(从文件名中抓取),所以在更改时我们有一个布局,如图所示下面(假设我们刚刚添加了一些图片):

Multiple Upload Form 几乎类似于: http://jsfiddle.net/pxfunc/WWNnV/4/


//这种布局的HTML表示将是...... (假设我们添加了3张图片)

<input type="file" name="fileupload[]" multiple>

  • image-name-1.jpg <input type="text" value="Image Name 1" name="keyword[]">
  • justsome_file.png <input type="text" value="Justsome File" name="keyword[]">
  • some_Img-031.gif <input type="text" value="Some Img 031" name="keyword[]">

<input type="submit" value="Upload">


我这样做是因为除了上传文件之外,我还想将它们添加到我的数据库中,基于文件名的默认标题(以及设置选项) /我上传时为每个图像更改此标题)。我的表单没有问题。

问题:我的困境在于提交表单数据/操作的PHP页面。

我只能设法:

  • 上传正确的图片,但所有
  • 的标题相同
  • 插入正确的标题,但为所有
  • 获取相同的图像

以下是我的PHP操作页面:(目前正在上传正确的图片,但所有人都有相同的标题

<?php
// CONNECT TO DATABASE...
// INCLUDE UPLOAD CLASS LIBRARY
include (dirname(__FILE__).'/lib/class.upload.php');


$files = array();
foreach ($_FILES['fileupload'] as $k => $l)
{
    foreach ($l as $i => $v)
    {
        if (!array_key_exists($i, $files))
        $files[$i] = array();
        $files[$i][$k] = $v;
        $imagename = $_POST['keyword'][$i];
    }
}

// create an array here to hold file names
$uploaded = array();
foreach ($files as $file)
 {
            $generate_name = rand(100,99999); 
            $generate_name_extra = rand(200,9999);
            $filenamex = "COVER_PHOTO_".$generate_name.$generate_name_extra."_".time();
            $filenamex_thumb = $filenamex."_thumb";

            $handle = new upload($file);
            if ($handle->uploaded) {
            $this_upload = array();

            ///// 1 ////////////////////////////////////////////////////////////////////
            $handle->file_new_name_body   = $filenamex_thumb;
            $handle->file_force_extension = true;
            $handle->image_resize         = true;
            $handle->image_x              = '300';
            $handle->image_ratio_y        = true;
            $handle->jpeg_quality = '100';

            // ABSOLUTE PATH BELOW
            $handle->process($absoRoot.'covers/thumbs/');
            ////////////////////////////////////////////////////////////////////////////
            if ($handle->processed) {

      // store the image filename
    $this_upload['image'] = $handle->file_dst_name; // Destination file name
    $this_upload['body'] = $handle->file_dst_name_body; // Destination file name body
    $this_upload['extension'] = $handle->file_dst_name_ext; // Destination file extension

        $category_id = $_POST['cat'];
        $hiddenvalues = explode ("|",$_POST["cat"]);
        $category = $hiddenvalues[0];
        $category_name = $hiddenvalues[1];


                $sql = 'INSERT INTO cover (id, img, keyword, category_name, cat_id) VALUES ("", "'.$this_upload['image'].'", "'.$imagename.'", "'.$category_name.'", "'.$category.'")';
                 mysql_query($sql);
        }

    $handle->clean();
        header("Location: ./upload.php");
                $message = "";
    } else {

         echo '  file not uploaded to the wanted location';
         echo '  Error: ' . $handle->error . '';

      }
} ?>

(我使用Upload Class by Colin Verot来处理图片上传,以及他们的FAQ教程,以处理this page, under: What about multiple uploads?上的多张图片上传

如果我只是上传图片,这将是完美的,但我添加了将每个图像数据添加到我的数据库的功能。 &安培;这是令人困惑的地方。

我确定关键是将SQL查询放在正确的foreach中,或者可能再创建另一个,但我已经尝试过了&amp;它只给我一个好的结果,无论是图像上传还是标题,从来都不是。

我需要将图像上传到网站,然后将其数据(包括图像路径)存储到我的数据库中。

请查看我的代码并赐教我如何解决这个问题?一个片段线索现在真的很棒,因为我已经尝试了所有我能想到的东西后已经非常困惑。非常感谢你!

3 个答案:

答案 0 :(得分:2)

您没有将$ imagename变量保存到$ files数组,而是每次都重置它。

    $files[$i][$k] = $v;
    $imagename = $_POST['keyword'][$i];

应该是这样的:

    $files[$i][$k] = array($v, $_POST['keyword'][$i]);
    ...
    foreach ($files as $data) {
        list($file, $imagename) = $data;
        ...
    }

答案 1 :(得分:2)

我确实认为你的一个问题是你的问题:

$files = array();
foreach ($_FILES['fileupload'] as $k => $l)
{
    foreach ($l as $i => $v)
    {
        if (!array_key_exists($i, $files))
        $files[$i] = array();
        $files[$i][$k] = $v;
        $imagename = $_POST['keyword'][$i];
    }
}

因此,您要浏览每个字段,将其值分配给符合此结构策略的正确文件:

_FILES => array(
    'name' => array(0 => 'file.txt'),
    'size' => array(0 => 235)
)

哪种方法适用于多文件,但您可以这样做:

$imagename = $_POST['keyword'][$i];

哪个看起来不正确。你每次用最后一次查看都会覆盖var,这意味着你只会获得一个输入值。

答案 2 :(得分:1)

当您收集文件信息时,您在每个循环上覆盖$imagename,因此它将被分配到最后一个循环。尝试将其附加到$files变量(希望这不会影响您正在使用的upload类。)

foreach ($l as $i => $v)
{
    if (!array_key_exists($i, $files))
    $files[$i] = array();
    $files[$i][$k] = $v;
    $files[$i]['imagename'] = $_POST['keyword'][$i];
}

然后更新您的$sql字符串以引用该

$sql = 'INSERT INTO cover (id, img, keyword, category_name, cat_id) 
     VALUES ("", "'.$this_upload['image'].'", "'.$file['imagename'].'", 
         "'.$category_name.'", "'.$category.'")';