在php中上传多个文件

时间:2010-04-24 11:42:43

标签: php file-upload

我想上传多个文件并将它们存储在一个文件夹中,然后获取路径并将其存储在数据库中...你想要做多个文件上传的好例子......

注意:文件可以是任何类型......

13 个答案:

答案 0 :(得分:223)

我知道这是一篇旧帖子,但对于试图上传多个文件的人来说,一些进一步的解释可能会有用......这就是你需要做的事情:

  • 输入名称必须定义为数组,即 name="inputName[]"
  • 输入元素必须为multiple="multiple"multiple
  • 在PHP文件中使用语法"$_FILES['inputName']['param'][index]"
  • 确保查找 空文件名和路径 ,该数组可能包含空字符串。在计算之前使用array_filter()

这是一个肮脏的例子(仅显示相关代码)

HTML:

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

PHP:

//$files = array_filter($_FILES['upload']['name']); //something like that to be used before processing files.

// Count # of uploaded files in array
$total = count($_FILES['upload']['name']);

// Loop through each file
for( $i=0 ; $i < $total ; $i++ ) {

  //Get the temp file path
  $tmpFilePath = $_FILES['upload']['tmp_name'][$i];

  //Make sure we have a file path
  if ($tmpFilePath != ""){
    //Setup our new file path
    $newFilePath = "./uploadFiles/" . $_FILES['upload']['name'][$i];

    //Upload the file into the temp dir
    if(move_uploaded_file($tmpFilePath, $newFilePath)) {

      //Handle other code here

    }
  }
}

希望这会有所帮助!

答案 1 :(得分:6)

<强> HTML

  1. 使用id='dvFile'创建div;

  2. 创建button;

  3. 该按钮的
  4. onclick调用函数add_more()

  5. <强>的JavaScript

    function  add_more() {
      var txt = "<br><input type=\"file\" name=\"item_file[]\">";
      document.getElementById("dvFile").innerHTML += txt;
    }
    

    <强> PHP

    if(count($_FILES["item_file"]['name'])>0)
     { 
    //check if any file uploaded
     $GLOBALS['msg'] = ""; //initiate the global message
      for($j=0; $j < count($_FILES["item_file"]['name']); $j++)
     { //loop the uploaded file array
       $filen = $_FILES["item_file"]['name']["$j"]; //file name
       $path = 'uploads/'.$filen; //generate the destination path
       if(move_uploaded_file($_FILES["item_file"]['tmp_name']["$j"],$path)) 
    {
       //upload the file
        $GLOBALS['msg'] .= "File# ".($j+1)." ($filen) uploaded successfully<br>";
        //Success message
       }
      }
     }
     else {
      $GLOBALS['msg'] = "No files found to upload"; //No file upload message 
    }
    

    通过这种方式,您可以根据需要添加文件/图像,并通过php脚本处理它们。

答案 2 :(得分:4)

与上传一个文件没有什么不同 - $_FILES是一个包含所有上传文件的数组。

PHP手册中有一章:Uploading multiple files

如果您想在用户端轻松选择多个文件上传(一次选择多个文件而不是填写上传字段),请查看SWFUpload。它的工作方式与普通的文件上传形式不同,但需要Flash才能工作。 SWFUpload与Flash一起被淘汰。检查现在正确方法的其他更新答案。

答案 3 :(得分:4)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php
$max_no_img=4; // Maximum number of images value to be set here

echo "<form method=post action='' enctype='multipart/form-data'>";
echo "<table border='0' width='400' cellspacing='0' cellpadding='0' align=center>";
for($i=1; $i<=$max_no_img; $i++){
echo "<tr><td>Images $i</td><td>
<input type=file name='images[]' class='bginput'></td></tr>";
}

echo "<tr><td colspan=2 align=center><input type=submit value='Add Image'></td></tr>";
echo "</form> </table>";
while(list($key,$value) = each($_FILES['images']['name']))
{
    //echo $key;
    //echo "<br>";
    //echo $value;
    //echo "<br>";
if(!empty($value)){   // this will check if any blank field is entered
$filename =rand(1,100000).$value;    // filename stores the value

$filename=str_replace(" ","_",$filename);// Add _ inplace of blank space in file name, you can remove this line

$add = "upload/$filename";   // upload directory path is set
//echo $_FILES['images']['type'][$key];     // uncomment this line if you want to display the file type
//echo "<br>";                             // Display a line break
copy($_FILES['images']['tmp_name'][$key], $add); 
echo $add;
    //  upload the file to the server
chmod("$add",0777);                 // set permission to the file.
}
}
?>
</body>
</html>

答案 4 :(得分:4)

简单的是,只需先计算文件数组,然后在while循环中就可以像

一样轻松完成
$count = count($_FILES{'item_file']['name']);

现在你有正确的文件总数。

在while循环中这样做:

$i = 0;
while($i<$count)
{
    Upload one by one like we do normally
    $i++;
}

答案 5 :(得分:3)

这是我写的一个函数,它返回一个更容易理解的$_FILES数组。

function getMultiple_FILES() {
    $_FILE = array();
    foreach($_FILES as $name => $file) {
        foreach($file as $property => $keys) {
            foreach($keys as $key => $value) {
                $_FILE[$name][$key][$property] = $value;
            }
        }
    }
    return $_FILE;
}

答案 6 :(得分:2)

这个简单的脚本对我有用。

<?php
$product_id = $_GET['product_id'];

if(!isset($_GET['product_id'])){ 
    $product_id='13321';}
    else 
{

include '../sys/conn.php';
$risultato = mysqli_query ($conn, "

(MYSQL Query)

") or die ("Query non valida: " . mysqli_error($conn));
mysqli_close($conn);
$row = mysqli_fetch_array($risultato)

}
?>

答案 7 :(得分:1)

我使用error元素运行foreach循环,看起来像

 foreach($_FILES['userfile']['error'] as $k=>$v)
 {
    $uploadfile = 'uploads/'. basename($_FILES['userfile']['name'][$k]);
    if (move_uploaded_file($_FILES['userfile']['tmp_name'][$k], $uploadfile)) 
    {
        echo "File : ", $_FILES['userfile']['name'][$k] ," is valid, and was                      successfully uploaded.\n";
    }

    else 
    {
        echo "Possible file : ", $_FILES['userfile']['name'][$k], " upload attack!\n";
    }   

 }

答案 8 :(得分:1)

刚刚遇到以下解决方案:

http://www.mydailyhacks.org/2014/11/05/php-multifile-uploader-for-php-5-4-5-5/

它是一个现成的PHP多文件上载脚本,其中包含一个表单,您可以在其中添加多个输入和一个AJAX进度条。它应该在服务器上解压后直接工作......

答案 9 :(得分:0)

我们可以使用以下脚本轻松上传多个文件。

Download Full Source code and preview

<?php
if (isset($_POST['submit'])) {
    $j = 0; //Variable for indexing uploaded image 

 $target_path = "uploads/"; //Declaring Path for uploaded images
    for ($i = 0; $i < count($_FILES['file']['name']); $i++) {//loop to get individual element from the array

        $validextensions = array("jpeg", "jpg", "png");  //Extensions which are allowed
        $ext = explode('.', basename($_FILES['file']['name'][$i]));//explode file name from dot(.) 
        $file_extension = end($ext); //store extensions in the variable

  $target_path = $target_path . md5(uniqid()) . "." . $ext[count($ext) - 1];//set the target path with a new name of image
        $j = $j + 1;//increment the number of uploaded images according to the files in array       

   if (($_FILES["file"]["size"][$i] < 100000) //Approx. 100kb files can be uploaded.
                && in_array($file_extension, $validextensions)) {
            if (move_uploaded_file($_FILES['file']['tmp_name'][$i], $target_path)) {//if file moved to uploads folder
                echo $j. ').<span id="noerror">Image uploaded successfully!.</span><br/><br/>';
            } else {//if file was not moved.
                echo $j. ').<span id="error">please try again!.</span><br/><br/>';
            }
        } else {//if file size and file type was incorrect.
            echo $j. ').<span id="error">***Invalid file Size or Type***</span><br/><br/>';
        }
    }
}
?>

答案 10 :(得分:0)

$property_images = $_FILES['property_images']['name'];
    if(!empty($property_images))
    {
        for($up=0;$up<count($property_images);$up++)
        {
            move_uploaded_file($_FILES['property_images']['tmp_name'][$up],'../images/property_images/'.$_FILES['property_images']['name'][$up]);
        }
    }

答案 11 :(得分:-1)

很好的链接:

PHP Single File Uploading with vary basic explanation

PHP file uploading with the Validation

PHP Multiple Files Upload With Validation Click here to download source code

PHP/jQuery Multiple Files Upload With The ProgressBar And Validation (Click here to download source code)

How To Upload Files In PHP And Store In MySql Database (Click here to download source code)

extract($_POST);
    $error=array();
    $extension=array("jpeg","jpg","png","gif");
    foreach($_FILES["files"]["tmp_name"] as $key=>$tmp_name)
            {
                $file_name=$_FILES["files"]["name"][$key];
                $file_tmp=$_FILES["files"]["tmp_name"][$key];
                $ext=pathinfo($file_name,PATHINFO_EXTENSION);
                if(in_array($ext,$extension))
                {
                    if(!file_exists("photo_gallery/".$txtGalleryName."/".$file_name))
                    {
                        move_uploaded_file($file_tmp=$_FILES["files"]["tmp_name"][$key],"photo_gallery/".$txtGalleryName."/".$file_name);
                    }
                    else
                    {
                        $filename=basename($file_name,$ext);
                        $newFileName=$filename.time().".".$ext;
                        move_uploaded_file($file_tmp=$_FILES["files"]["tmp_name"][$key],"photo_gallery/".$txtGalleryName."/".$newFileName);
                    }
                }
                else
                {
                    array_push($error,"$file_name, ");
                }
            }

您必须检查HTML代码

<form action="create_photo_gallery.php" method="post" enctype="multipart/form-data">
    <table width="100%">
        <tr>
            <td>Select Photo (one or multiple):</td>
            <td><input type="file" name="files[]" multiple/></td>
        </tr>
        <tr>
            <td colspan="2" align="center">Note: Supported image format: .jpeg, .jpg, .png, .gif</td>
        </tr>
        <tr>
            <td colspan="2" align="center"><input type="submit" value="Create Gallery" id="selectedButton"/></td>
        </tr>
    </table>
</form>

很好的链接:

PHP Single File Uploading with vary basic explanation

PHP file uploading with the Validation

PHP Multiple Files Upload With Validation Click here to download source code

PHP/jQuery Multiple Files Upload With The ProgressBar And Validation (Click here to download source code)

How To Upload Files In PHP And Store In MySql Database (Click here to download source code)

答案 12 :(得分:-1)

这对我有用。我必须上载文件,存储文件名,并且还要从输入字段中存储其他信息,并且每个文件名应包含一个记录。 我使用serialize()然后将其添加到主要的SQL查询中。

  class addReminder extends dbconn {
    public function addNewReminder(){

           $this->exdate = $_POST['exdate'];
           $this->name = $_POST['name'];
           $this->category = $_POST['category'];
           $this->location = $_POST['location'];
           $this->notes = $_POST['notes'];



           try {

                     if(isset($_POST['submit'])){
                       $total = count($_FILES['fileUpload']['tmp_name']);
                       for($i=0;$i<$total;$i++){
                         $fileName = $_FILES['fileUpload']['name'][$i];
                         $ext = pathinfo($fileName, PATHINFO_EXTENSION);
                         $newFileName = md5(uniqid());
                         $fileDest = 'filesUploaded/'.$newFileName.'.'.$ext;
                         $justFileName = $newFileName.'.'.$ext;
                         if($ext === 'pdf' || 'jpeg' || 'JPG'){
                             move_uploaded_file($_FILES['fileUpload']['tmp_name'][$i], $fileDest);
                             $this->fileName = array($justFileName);
                             $this->encodedFileNames = serialize($this->fileName);
                             var_dump($this->encodedFileNames);
                         }else{
                           echo $fileName . ' Could not be uploaded. Pdfs and jpegs only please';
                         }
                       }

                    $sql = "INSERT INTO reminders (exdate, name, category, location, fileUpload, notes) VALUES (:exdate,:name,:category,:location,:fileName,:notes)";
                    $stmt = $this->connect()->prepare($sql);
                    $stmt->bindParam(':exdate', $this->exdate);
                    $stmt->bindParam(':name', $this->name);
                    $stmt->bindParam(':category', $this->category);
                    $stmt->bindParam(':location', $this->location);
                    $stmt->bindParam(':fileName', $this->encodedFileNames);
                    $stmt->bindParam(':notes', $this->notes);
                    $stmt->execute();
                  }

           }catch(PDOException $e){
             echo $e->getMessage();
           }
      }
    }