【问题标题】:uploading multiple image files to php mysql gallery将多个图像文件上传到 php mysql 库
【发布时间】:2013-07-11 21:17:48
【问题描述】:

我让这个厨房在我想要的地方工作了大约 65%。我想知道是否有人可以查看以下代码并告诉我如何将多张图片上传到我的画廊。

这里是代码。

简单的管理表单代码:

    <form enctype="multipart/form-data" action="uploader.php" method="POST">


        Category: <select class="text" name="dataType[]">
        <option value="treeremoval" selected="selected">treeremoval</option>
        <option value="treetrimming" >treetrimming</option>
        <option value="treebracing" >treebracing</option>
        <option value="stumpgrinding" >stumpgrinding</option>
        <option value="firewood" >firewood</option>
        <option value="cleanup" >cleanup</option>
        </select>
<br /><br />

    Caption: <input type="text" name="title[]">
<br /><br />

Image to upload: <input type="file" name="image[]" />
<br /><br />






        Category: <select class="text" name="dataType[]">
        <option value="treeremoval" selected="selected">treeremoval</option>
        <option value="treetrimming" >treetrimming</option>
        <option value="treebracing" >treebracing</option>
        <option value="stumpgrinding" >stumpgrinding</option>
        <option value="firewood" >firewood</option>
        <option value="cleanup" >cleanup</option>
        </select>
<br /><br />

    Caption: <input type="text" name="title[]">
<br /><br />

Image to upload: <input type="file" name="image[]" />
<br /><br />



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

uploader.php 代码:


    <?php
include($_SERVER['DOCUMENT_ROOT'] . "/connections/dbconnect.php");

$dataType = mysql_real_escape_string($_POST["dataType"][$i]);
$title = mysql_real_escape_string($_POST["title"][$i]);

$fileData = pathinfo(basename($_FILES["image"]["name"][$i]));

$fileName = uniqid() . '.' . $fileData['extension'][$i];

$target_path = ($_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName);


for($i=0;$i<count($_FILES["image"]["name"]);$i++){

 $dataType = mysql_real_escape_string($_POST["dataType"][$i]);  // get the dataType with the same key - $i
    $title = mysql_real_escape_string($_POST["title"][$i]);   // get the title with the same key - $i

    $fileData = pathinfo(basename($_FILES["image"]["name"][$i]));
while(file_exists($target_path))
{
    $fileName = uniqid() . '.' . $fileData['extension'];
    $target_path = ($_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName);
}

 if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path))
    {    // The file is in the images/gallery folder. Insert record into database by
    // executing the following query:
     $sql="INSERT INTO images (data_type, title, file_name)"."VALUES('$dataType','$title','$fileName')";
     $retval = mysql_query($sql);



echo "The image {$_FILES['image']['name'][$i]} was successfully uploaded and added to the gallery<br />
     <a href='index.php'>Add another image</a><br />";


}
else
{
 echo "There was an error uploading the file {$_FILES['image']['name'][$i]}, please try again!<br />";
    }
} // close your foreach
?>

我尝试复制表单代码 4 次,但它只会将 1 张图片上传到图库。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 添加多个&lt;input type="file"&gt;,每个都有一个唯一的名称
  • 你可以用一种相对简单的方式来设置它......我认为它在输入类型 =“文件”上,你把数据类型放在哪里......或者什么?然后你的 $_FILES 将是几个文件的数组。我们在学校做了这个,一个输入多个文件,但我们使用了一个教师模板,所以我忘记了。如果找不到,请通知我,我会搜索我的文件。
  • @Dagon 你能详细解释一下吗?抱歉,这种编码有点新意。
  • @Ariane 我喜欢您的解决方案,如果您能找到该文件,我将不胜感激。你可以发邮件给我 daugaard47@gmail.com

标签: php mysql multifile-uploader


【解决方案1】:

在您的表单中,添加多个文件输入。一种方法是使用数组名称 - image[]

Image to upload: <input type="file" name="image[]" /><br />
Image to upload: <input type="file" name="image[]" /><br />
Image to upload: <input type="file" name="image[]" /><br />
....  // as many as you want. Just be aware of upload_max_filesize, memory_limit, post_max_size etc.
<br /> 

然后在您的 uploader.php 中,使用 for 循环包装您的文件上传代码

for($i=0;$i<count($_FILES["image"]["name"]);$i++){

    $fileData = pathinfo(basename($_FILES["image"]["name"][$i]));

     ...

    if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path))
    {
      ...

      echo "The image {$_FILES['image']['name'][$i]} was successfully uploaded and added to the gallery<br />";

    }
    else
    {
     echo "There was an error uploading the file {$_FILES['image']['name'][$i]}, please try again!<br />";
    }
} // close your foreach

该手册有很大一部分介绍了上传文件时的常见陷阱,尤其是多个文件。 http://www.php.net/manual/en/features.file-upload.common-pitfalls.php


如果你想做多个其他的,也可以用同样的方法(我缩写了选择以减少复制/粘贴)-

<form enctype="multipart/form-data" action="uploader.php" method="POST">

    // 1st set
    Category: <select class="text" name="dataType[]" />
    ...
    </select><br />
    <br />        

    Caption: <input type="text" name="title[]" /><br />
    <br />

    Image to upload: <input type="file" name="image[]" /><br />
    <br /> 

    // 2nd set
    Category: <select class="text" name="dataType[]" />
    ...
    </select><br />
    <br />        

    Caption: <input type="text" name="title[]" /><br />
    <br />

    Image to upload: <input type="file" name="image[]" /><br />
    <br />  

   // and so on, as many as you want  
   ...
    <input type="submit" value="Upload">
</form>

和你的 php,在所有元素周围放置 for 循环

for($i=0;$i<count($_FILES["image"]["name"]);$i++){

    $dataType = mysql_real_escape_string($_POST["dataType"][$i]);  // get the dataType with the same key - $i
    $title = mysql_real_escape_string($_POST["title"][$i]);   // get the title with the same key - $i

    $fileData = pathinfo(basename($_FILES["image"]["name"][$i]));

     ...

    if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path))
    {
      ...

      echo "The image {$_FILES['image']['name'][$i]} was successfully uploaded and added to the gallery<br />";

    }
    else
    {
     echo "There was an error uploading the file {$_FILES['image']['name'][$i]}, please try again!<br />";
    }
} // close your foreach

编辑
你快到了。删除 for 循环上方的重复代码。删除basename(),因为这会导致您的extension 失败,而pathinfo() 将返回['basename']

<?php
include($_SERVER['DOCUMENT_ROOT'] . "/connections/dbconnect.php");

for($i=0;$i<count($_FILES["image"]["name"]);$i++){
  if($_FILES["image"]["name"][$i] != ''){ // don't insert if file name empty
    $dataType = mysql_real_escape_string($_POST["dataType"][$i]);
    $title = mysql_real_escape_string($_POST["title"][$i]);

    $fileData = pathinfo($_FILES["image"]["name"][$i]);

    $fileName = uniqid() . '.' . $fileData['extension'];
    $target_path = $_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName;

    while(file_exists($target_path)){
       $fileName = uniqid() . '.' . $fileData['extension'];
       $target_path = $_SERVER['DOCUMENT_ROOT'] . "/images/gallery/" . $fileName;
    }     

  if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path)){    // The file is in the images/gallery folder. 
    // Insert record into database by executing the following query:
     $sql="INSERT INTO images (data_type, title, file_name) "."VALUES('$dataType','$title','$fileName')";
     $retval = mysql_query($sql);

    echo "The image {$_FILES['image']['name'][$i]} was successfully uploaded and added to the gallery<br />
     <a href='index.php'>Add another image</a><br />";
  }
  else
  {
   echo "There was an error uploading the file {$_FILES['image']['name'][$i]}, please try again!<br />";
    }
  }
} // close your foreach
?>

【讨论】:

  • 我很抱歉在这方面没有受过教育,我意识到答案就在我面前,但是当我通过许多错误尝试它时。您能否使用我提供的代码并为我修改它。只是不确定从哪里开始 foreach 脚本...?
  • 我确实使用了你的代码。我不想复制/粘贴所有内容,所以我使用缩写... 来显示您不需要更改的内容。保留您的代码,但只需添加/编辑我显示的行。
  • 你也可以在 php 手册中阅读它 - php.net/manual/en/features.file-upload.multiple.php
  • 在重读我的答案时,我意识到我有点不对劲。而不是foreach($_FILES['image'] as $files),你需要做一个for循环-for($i=0;$i&lt;count($_FILES["image"]["name"]);$i++)。那是因为它发布为$_FILES["image"]["name"][$i] 而不是$_FILES["image"][$i]["name"]。我已经更新了我的答案以反映这一点。
  • @user1666456 不像我拥有的​​那样。而不是foreach($_FILES['image'] as $files),我认为它必须是foreach($_FILES['image']['name'] as $key =&gt; $value),然后使用那个键-$_FILES["image"]["name"][$key]。我原来的方式是循环通过$_FILES数组-[name],[type],[tmp_name],[size],[error],而不是文件数组。
【解决方案2】:

显然,在 Internet Explorer 版本 10(!) 之前不支持的 HTML5 功能允许您执行此操作:

<input name="upload[]" type="file" multiple="multiple" />

这也是有效的:

<input name="upload[]" type="file" multiple />

(结束斜线是兼性的,但我喜欢自闭标签有斜线,所以我决定放斜线。)

但是有 JavaScript 等工具显然扩大了兼容性。就像这个 Jquery 的东西。 blueimp.github.io/jQuery-File-Upload

(来源:How to select multiple files with <input type="file">?

(我确信有一个更简单、兼容 IE 的方法,但也许是我想象出来的。不管怎样,我显然在假期离开之前把我老师的上传文档留在了学校,所以我可以'不确定。)

所以...是的。你有这个 multiple="multiple" 输入来完成这项工作。但它绝对不能满足您的需求。因为,你知道,没有多少人拥有 IE 10,放弃 IE 是有限制的。从那以后,您有几个选择。

  1. 使用诸如 Modernizr 之类的工具检查与多文件输入的兼容性,如果浏览器不兼容,那么您将显示多个单文件输入而不是它。或者可能只是一个,然后,当使用前一个时,您可以通过 Javascript 添加另一个。

  2. 查看 jQuery 插件或其他类似工具以“强制”浏览器与您的多文件输入兼容。

使用例子多文件输入:

HTML:

<form method="post" action="upload.php" enctype="multipart/form-data">
    <input name="uploads[]" type="file" multiple="multiple" />
    <input type="submit" value="Send" />
</form>

然后在 PHP 中,您的所有文件都将存储在您通常可以找到单个文件的位置,除了现在它将是一个数组,您将通过添加额外的方括号层来访问它。例如,$_FILES['uploads']['name'][0] 是您的第一个文件。

以下代码将允许您遍历每个文件。当然,这段代码只显示每个文件名,但是你可以改变循环的内容。

foreach ($_FILES['uploads']['name'] as $filename) {
    echo '<li>' . $filename . '</li>';
}

在这个循环中,您将像处理单个文件一样上传每个文件。

(来源:http://css-tricks.com/snippets/html/multiple-file-input/

【讨论】:

  • 可以吗?
  • 不确定是否可以将“true”写为multiple 属性的值。只需&lt;input type="file" name="upload[]" multiple&gt; 即可。另外,请确保您的表单有enctype="multipart/form-data"
【解决方案3】:

最简单的方法是添加多个具有相同名称的file 输入(以一种形式),并添加方括号:

<input type="file" name="image[]">

然后您可以通过添加递增编号来访问文件:

$_FILES["image"]["name"][0] 

因此,您将整个上传后的过程放入一个循环遍历文件的循环中。 请注意,如果您并不总是在每个文件输入中提交图像,一些变量 (=inputs) 将保持为空,您需要将错误处理更改为不显示错误。 我会这样做:

if (move_uploaded_file($_FILES["image"]["tmp_name"][$i], $target_path)) {
     //processing...
} else if (!empty($_FILES["image"]["name"][$i]) {
     //error
}

【讨论】:

    【解决方案4】:

    我不知道我是否可以发布链接,但我发现这个正在寻找一个上传多个文件的系统,并希望与所有其他正在寻找这个的人分享。

    MySQL

    CREATE TABLE `upload_data` (
      `ID` int(5) NOT NULL AUTO_INCREMENT,
      `USER_CODE` int(4) unsigned zerofill NOT NULL,
      `FILE_NAME` varchar(200) NOT NULL,
      `FILE_SIZE` varchar(200) NOT NULL,
      `FILE_TYPE` varchar(200) NOT NULL,
      PRIMARY KEY (`ID`)
    )
    

    PHP

    <?php
    if(isset($_FILES['files'])){
        $errors= array();
        foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
            $file_name = $key.$_FILES['files']['name'][$key];
            $file_size =$_FILES['files']['size'][$key];
            $file_tmp =$_FILES['files']['tmp_name'][$key];
            $file_type=$_FILES['files']['type'][$key];  
            if($file_size > 2097152){
                $errors[]='File size must be less than 2 MB';
            }       
            $query="INSERT into upload_data (`USER_ID`,`FILE_NAME`,`FILE_SIZE`,`FILE_TYPE`) VALUES('$user_id','$file_name','$file_size','$file_type'); ";
            $desired_dir="user_data";
            if(empty($errors)==true){
                if(is_dir($desired_dir)==false){
                    mkdir("$desired_dir", 0700);        // Create directory if it does not exist
                }
                if(is_dir("$desired_dir/".$file_name)==false){
                    move_uploaded_file($file_tmp,"user_data/".$file_name);
                }else{                                  //rename the file if another one exist
                    $new_dir="user_data/".$file_name.time();
                     rename($file_tmp,$new_dir) ;               
                }
                mysql_query($query);            
            }else{
                    print_r($errors);
            }
        }
        if(empty($error)){
            echo "Success";
        }
    }
    ?>
    
    
    <form action="" method="POST" enctype="multipart/form-data">
        <input type="file" name="files[]" multiple/>
        <input type="submit"/>
    </form>
    

    就是这样!希望对某人有所帮助^^ 完整的解释和所有学分: http://techstream.org/Web-Development/PHP/Multiple-File-Upload-with-PHP-and-MySQL

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2014-02-25
      • 2016-05-28
      • 1970-01-01
      • 2022-01-16
      • 2011-08-14
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      相关资源
      最近更新 更多