0

Hi I am facing a problem while uploading two files using php. I have this html input form with two files field

<form class="form-group" method="post" enctype="multipart/form-data">

<input type="file" accept=".jpg, .jpeg, .png" id="img" name="displaypic" required/>     

<input type="file" accept=".pptx" name="presentation" required>

<button name="submit>Submit</submit>   
</form>

This is my php code. Here I take the file data from the form but only the first one is uploaded, second file is not.

        <?php
    if(isset($_POST['submit'])){
    
        $file = $_FILES['displaypic'];
                  $fileName = $_FILES['displaypic']['name'];
                  $tempName = $_FILES['displaypic']['tmp_name'];
                  $size = $_FILES['displaypic']['size'];
                  $error = $_FILES['displaypic']['error'];
                  $format = $_FILES['displaypic']['type'];
                  $fileExt = explode('.', $fileName);
                  $fileActualExt = strtolower(end($fileExt));
                  $allowed = array('jpg', 'jpeg','png');
 
                  
            if(in_array($fileActualExt, $allowed)) {
                if ($error === 0) {
                    if ($size<2e6) {
                        $newname = $tid.".".$fileActualExt;
                        $location = 'displays/'.$newname;
                        move_uploaded_file($tempName,$location);
    }}}
    

Similarly when I write the same code for file two it doesn't work. Only the first file is uploaded not the second file.

    $file_ppt = $_FILES['presentation'];
                  $fileName = $_FILES['presentation']['name'];
                  $tempName = $_FILES['presentation']['tmp_name'];
                  $size = $_FILES['presentation']['size'];
                  $error = $_FILES['presentation']['error'];
                  $format = $_FILES['presentation']['type'];
                  $fileExt = explode('.', $fileName);
                  $fileActualExt = strtolower(end($fileExt));
                  $allowed = array('pptx');
 
                  
            if(in_array($fileActualExt, $allowed)) {
                if ($error === 0) {
                    if ($size<10e6) {
                        $newname = $tid.".".$fileActualExt;
                        $location = 'presentations/'.$newname;
                        move_uploaded_file($tempName,$location);
    }}}
    }
    ?>
3
  • You might try with the same name for both fields, such as xfiles[] or whatever Commented Oct 27, 2021 at 6:45
  • Please check your file extension "pptx" for second file. also check file size and allowed size in php.ini Commented Oct 27, 2021 at 6:47
  • You only check that there are no errors, but you never do/log anything if there are, so check what $error contains. Commented Oct 27, 2021 at 7:00

1 Answer 1

1

If you use the same name for the file input field but use the array style syntax for the name you can assign your own identifier within the square braces which will be available in the POST / FILES array later. This identifier can be used to separate the different types of files so you can fork the logic as appropriate to your needs.

The following shows a basic usage of this methodology - it might prove of interest but it might not.

<?php
    $field='xfiles';     // Whatever you wish to name your file input elements
    $errors=array();
    $status=array();
    $maxfs=pow(1024,2) * 5; //5Mb or whatever.... 10e6?
    
    if( $_SERVER['REQUEST_METHOD']=='POST' && isset( $_FILES[ $field ] ) ){
        $obj=$_FILES[ $field ];
        
        foreach( $obj['name'] as $index => $void ){
            $name=$obj['name'][ $index ];
            $tmp=$obj['tmp_name'][ $index ];
            $error=$obj['error'][ $index ];
            $type=$obj['type'][ $index ];
            $size=$obj['size'][ $index ];
            $ext=strtolower(pathinfo($name,PATHINFO_EXTENSION));
            
            $allowed=(object)array(
                'displaypic'    =>  array('jpg','jpeg','png'),
                'presentation'  =>  array('ppt','pptx')
            );
            
            if( $error!==UPLOAD_ERR_OK )$errors[]=sprintf('An error [code:%d] occurred with file %s',$error,$name);
            if( !in_array( $ext, $allowed->$index ) )$errors[]=sprintf('Incorrect file extension %s for %s',$ext,$name);
            if( $size > $maxfs )$errors[]=sprintf('The file %s is too large @%d',$name,$size);
            
            
            
            if( empty( $errors ) ){
                $status[]=sprintf('<div>%s uploaded successfully - save to db, do a happy little dance or whatever else you need to do!</div>', $name );
                
                #move_uploaded_file($tmp,'/path/to/new/folder/'.$name);
                #$sql='insert into ....';
                
            }
        }
    }
?>
<!DOCTYPE html>
<html lang='en'>
    <head>
        <title>PHP: Multiple file uploads</title>
        <meta charset='utf-8' />
    </head>
    <body>
        <form class='form-group' method='post' enctype='multipart/form-data'>
            <label>Display - [accept:jpg,png]<input type='file' accept='.jpg, .jpeg, .png' name='xfiles[displaypic]' required /></label>
            <label>Presentation - [accept:ppt,pptx] <input type='file' accept='.ppt, .pptx' name='xfiles[presentation]' required /></label>
            <input type='submit' />
            <?php
                if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $status ) ){
                    echo '<h1>Success</h1>';
                    foreach($status as $msg)printf('<div>%s</div>',$msg);
                }
                
                if( $_SERVER['REQUEST_METHOD']=='POST' && !empty( $errors ) ){
                    echo '<h1>Error</h1>';
                    foreach($errors as $error)printf('<div>%s</div>',$error);
                }
            ?>
        </form>
    </body>
</html>
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks it worked, now I only want that both files have names of my choice in this code. what parameter to change in the foreach category

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.