0

I am trying to make a file upload script for my website but I can't figure out how to get the name and size values out my array (I am not very good with arrays).

I can get it to work with uploading a single file, but how can I get it to loop?

I need to upload it to my server, and it's also created an entry in the database.

Here is my code...

HTML:

<form method="post" action="" enctype="multipart/form-data">
  <textarea name="reply_message"></textarea>
  <input name="attachments[]" type="file" size="20">
  <input type="submit" name="ReplyForm" value="Send">
</form>

PHP:

if(!empty($_POST['reply_message']))
{
    $reply_messages = $_POST['reply_message'];

    $database->query('INSERT INTO email_response (email_id, message) VALUES (?, ?)', array($email_id, $reply_message));

    if(isset($_FILES['attachments']))
    {
        require("upload.class.php");
        $upload = new upload();

        $last_email_response_id = $database->lastInsertId();
        $attachments = $_FILES['attachments'];

        foreach($attachments as $key => $value)
        {
            print_r($attachments);

            $database->query('INSERT INTO email_attachments (email_id, reply_id, file_name, created) VALUES (?, ?, ?, NOW())', array($email_id, $last_email_response_id, $attachments['name'][0]));

            $last_attachment_id = $database->lastInsertId();

            $upload->set('attachments', ATTACHMENTS.$reply_result->sender_email.'/'.$email_id.'/'.$last_attachment_id);

            $upload->upload();
        }
    }
}

Array (with uploading two files):

Array (
  [name] => Array (
    [0] => linkdownarrow.gif
    [1] => overlay-button.png
  )
  [type] => Array (
    [0] => image/gif
    [1] => image/png
  )
  [tmp_name] => Array (
    [0] => F:\xampp\tmp\phpFEC0.tmp
    [1] => F:\xampp\tmp\phpFEC1.tmp
  )
  [error] => Array (
    [0] => 0
    [1] => 0
  )
  [size] => Array (
    [0] => 63
    [1] => 135
  )
)
Draven
  • 1,467
  • 2
  • 19
  • 47

4 Answers4

0
if(count($_FILES['attachments']) > 0) {
    for($i = 0; $i < count($_FILES['attachments']); $i++) {
        move_uploaded_file($_FILES['attachments']['tmp_name'][$i], 'new/path');
        echo 'The name of the file is' . $_FILES['attachments']['name'][$i];
    }
    // or
    foreach($_FILES['attachments'] as $attachment) {
        echo $attachment['name'];
    }
}
Mihai Matei
  • 24,166
  • 5
  • 32
  • 50
0

Another way: You can rewrite the $_FILES array...

    $attachments = array();

    if(count($_FILES['attachments']) > 0)
    {
      for($i = 0; $i < count($_FILES['attachments']); $i++)
      {
        $attachments[] = array(
          'name' => $_FILES['attachments']['name'][$i],
          'size' => $_FILES['attachments']['size'][$i],
          'tmp_name' => $_FILES['attachments']['tmp_name'][$i],
          'type' => $_FILES['attachments']['type'][$i],
          'error' => $_FILES['attachments']['error'][$i],
        );
      }
    }

    print_r($attachments);

The output will look like this:

Array (
  [0] => Array (
    ['name'] => linkdownarrow.gif
    ['type'] => image/gif
    ['tmp_name'] => F:\xampp\tmp\phpFEC0.tmp
    ['error'] => 0
    ['size'] => 63
  )
  [1] => Array (
    ['name'] => overlay-button.png
    ['type'] => image/png
    ['tmp_name'] => F:\xampp\tmp\phpFEC1.tmp
    ['error'] => 0
    ['size'] => 135
  )
)

Now you can use it:

    foreach($attachments as $attachment)
    {
        $database->query('INSERT INTO email_attachments (email_id, reply_id, file_name, created) VALUES (?, ?, ?, NOW())', array($email_id, $last_email_response_id, $attachment['name']));
        $last_attachment_id = $database->lastInsertId();
        $upload->set('attachments', ATTACHMENTS.$reply_result->sender_email.'/'.$email_id.'/'.$last_attachment_id);
        $upload->upload();
    }
Besnik
  • 6,469
  • 1
  • 31
  • 33
  • For some reason it wants to loop 5 times. My arrays turns out like this... http://pastebin.com/dSWq0fqw – Draven Aug 06 '12 at 08:45
0

You can try something like this;

$img_types = array('image/jpeg', 'image/pjpeg');
$img_count = count($_FILES['attachments']['name']);
for($i = 0; $i < $img_count; $i++) {
    $tmp_name = $_FILES['attachments']['tmp_name'][$i];

    // forget empty file[] fields
    if($tmp_name == '') {
        continue;
    }

    // or more secure way to check allowed file types
    if(in_array($_FILES['attachments']['type'][$i], $img_types)) {
        // resize_images() etc...
    }
}
Kerem
  • 11,377
  • 5
  • 59
  • 58
0

I got it to work with this....

$attachments = $_FILES['attachments'];
if(count($attachments['name']) > 0)
{
    for($i = 0; $i < count($attachments['name']); $i++)
    {
        $database->query('INSERT INTO email_attachments (email_id, reply_id, file_name, file_size, created) VALUES (?, ?, ?, ?, NOW())', array($email_id, $last_email_response_id, $attachments['name'][$i], $attachments['size'][$i]));

        $last_attachment_id = $database->lastInsertId();

        $upload->set('attachments', ATTACHMENTS.$reply_result->sender_email.DS.$email_id.DS.$last_attachment_id);
        $upload->upload();
    }
}
Draven
  • 1,467
  • 2
  • 19
  • 47