How do you loop through $_FILES array?

前端 未结 8 872
陌清茗
陌清茗 2020-11-28 09:56

Here are the inputs I want to loop through

Main photo:   
Side photo 1: 

        
8条回答
  •  半阙折子戏
    2020-11-28 10:31

    Your example form should work fine. It's just that you are expecting the structure of the $_FILES superglobal to be different than it actually is, when using an array structure for the field names.

    The structure of this multidimensional array is as followed then:

    $_FILES[fieldname] => array(
        [name] => array( /* these arrays are the size you expect */ )
        [type] => array( /* these arrays are the size you expect */ )
        [tmp_name] => array( /* these arrays are the size you expect */ )
        [error] => array( /* these arrays are the size you expect */ )
        [size] => array( /* these arrays are the size you expect */ )
    );
    

    Therefor count( $_FILES[ "fieldname" ] ) will yield 5.
    But counting deeper dimensions will also not produce the result you may expect. Counting the fields with count( $_FILES[ "fieldname" ][ "tmp_name" ] ) for instance, will always result in the number of file fields, not in the number of files that have actually been uploaded. You'd still have to loop through the elements to determine whether anything has been uploaded for a particular file field.

    EDIT
    So, to loop through the fields you would do something like the following:

    // !empty( $_FILES ) is an extra safety precaution
    // in case the form's enctype="multipart/form-data" attribute is missing
    // or in case your form doesn't have any file field elements
    if( strtolower( $_SERVER[ 'REQUEST_METHOD' ] ) == 'post' && !empty( $_FILES ) )
    {
        foreach( $_FILES[ 'image' ][ 'tmp_name' ] as $index => $tmpName )
        {
            if( !empty( $_FILES[ 'image' ][ 'error' ][ $index ] ) )
            {
                // some error occured with the file in index $index
                // yield an error here
                return false; // return false also immediately perhaps??
            }
    
            /*
                edit: the following is not necessary actually as it is now 
                defined in the foreach statement ($index => $tmpName)
    
                // extract the temporary location
                $tmpName = $_FILES[ 'image' ][ 'tmp_name' ][ $index ];
            */
    
            // check whether it's not empty, and whether it indeed is an uploaded file
            if( !empty( $tmpName ) && is_uploaded_file( $tmpName ) )
            {
                // the path to the actual uploaded file is in $_FILES[ 'image' ][ 'tmp_name' ][ $index ]
                // do something with it:
                move_uploaded_file( $tmpName, $someDestinationPath ); // move to new location perhaps?
            }
        }
    }
    

    For more information see the docs.

提交回复
热议问题