2

i have made a php multiple uploader.

it works, but only with one file each time. if select (example) 4 of something else it doest upload put something in the db.

here is the code:

if(isset($_FILES['files'])){
$errors= array();
foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
    $file_name = $_FILES['files']['name'][$key];
    $naamzonderwww = substr($file_name, 21, -4);
    $artiest = $_POST['artiest'];
    $file_size =$_FILES['files']['size'][$key];
    $file_tmp =$_FILES['files']['tmp_name'][$key];
    $file_type=$_FILES['files']['type'][$key];  

    $DB = mysql_query("INSERT INTO `audio` (titel, url, categorie) values ('".$naamzonderwww."', 'http://.com/audio/files/".$file_name."','".$artiest."')");
    $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

<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="files[]" multiple="" />
    <p>
    <label>Artiest</label>
    <input type="text" name="artiest" />
    </p>
    <input type="submit"/>
</form>
Darren
  • 13,050
  • 4
  • 41
  • 79
pipi
  • 21
  • 2
  • 3
    Change `foreach($_FILES['files']['tmp_name']` to `foreach($_FILES['files']` and then use `$_FILES['files][$key]['name']`....etc – Darren Dec 22 '15 at 23:16
  • foreach($_FILES['files']] as $key => $tmp_name ){ $file_name = $_FILES['files']['name'][$key]; $naamzonderwww = substr($file_name, 21, -4); $artiest = $_POST['artiest']; $file_tmp =$_FILES['files']['tmp_name'][$key]; – pipi Dec 22 '15 at 23:29
  • [See my answer here](http://stackoverflow.com/a/34426215/2518525) – Darren Dec 22 '15 at 23:31

3 Answers3

0

You're looping it completely wrong and only ever using the first iteration. What you want to do is loop your $_FILES array, and then go through each of those array elements:

foreach($_FILES['files'] as $key => $file){
    $file_name = $_FILES['files'][$key]['name'];
    $naamzonderwww = substr($file_name, 21, -4);
    $artiest = $_POST['artiest'];
    $file_size =$_FILES['files'][$key]['size'];
    $file_tmp =$_FILES['files'][$key]['tmp_name'];
    $file_type=$_FILES['files'][$key]['type'];
    //....etc...the rest of your code
}

That way, you're fetching the current files information.


Alternatively, you could loop and just use the $file:

foreach($_FILES['files'] as $file){
    $file_name = $file['name'];
    $naamzonderwww = substr($file_name, 21, -4);
    $artiest = $_POST['artiest'];
    $file_size =$file['size'];
    $file_tmp =$file['tmp_name'];
    $file_type=$file['type'];
    //....etc...the rest of your code
}

That way (above example), you're actually using the current element in the loop.

Darren
  • 13,050
  • 4
  • 41
  • 79
0

i have this now

if(isset($_FILES['files'])){
    $errors= array();
foreach($_FILES['files'] as $file){
    $file_name = $file['name'];
    $naamzonderwww = substr($file_name, 21, -4);
    $artiest = $_POST['artiest'];
    $file_size =$file['size'];
    $file_tmp =$file['tmp_name'];
    $file_type=$file['type'];

         
        $DB = mysql_query("INSERT INTO `audio` (titel, url, categorie) values ('".$naamzonderwww."', 'http://helemaalleip.com/audio/files/".$file_name."','".$artiest."')");
        $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";
 }
}
pipi
  • 21
  • 2
0

The $_FILES array structure changes when uploading multiple files. Here's an example dump (Source):

Array
(
    [name] => Array
        (
            [0] => foo.txt
            [1] => bar.txt
        )

    [type] => Array
        (
            [0] => text/plain
            [1] => text/plain
        )

    [tmp_name] => Array
        (
            [0] => /tmp/phpYzdqkD
            [1] => /tmp/phpeEwEWG
        )

    [error] => Array
        (
            [0] => 0
            [1] => 0
        )

    [size] => Array
        (
            [0] => 123
            [1] => 456
        )
)

So you need to approach the loop differently. (Source)

foreach($i = 0; $i < count($_FILES['files']['name']); $i++){
    $file_name = $_FILES['files']['name'][$i];
    //the rest of your code
}
Community
  • 1
  • 1
Revenant
  • 260
  • 1
  • 11