Make WordPress Core

Changeset 52837


Ignore:
Timestamp:
03/10/2022 01:08:19 PM (2 years ago)
Author:
spacedmonkey
Message:

Media: Store attachment’s file size in metadata.

Store the file size of all newly uploaded attachments, as part of the metadata stored in post meta. Storing file size means, developers will not have to resort to doing filesize function calls, that can be time consuming on assets on offloaded to services like Amazon’s S3.

This change also introduces a new helper function called, wp_filesize. This is a wrapper around the filesize php function, that adds some helpful filters and ensures the return value is an integer.

Props Cybr, Spacedmonkey, SergeyBiryukov, johnwatkins0, swissspidy, desrosj, joemcgill, azaozz, antpb, adamsilverstein, uday17035.
Fixes #49412.

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/file.php

    r52734 r52837  
    25562556    return false;
    25572557}
     2558
     2559/**
     2560 * Wrapper for PHP filesize with filters and casting the result as an integer.
     2561 *
     2562 * @since 6.0.0
     2563 *
     2564 * @link https://www.php.net/manual/en/function.filesize.php
     2565 *
     2566 * @param string $path Path to the file.
     2567 * @return int The size of the file in bytes, or 0 in the event of an error.
     2568 */
     2569function wp_filesize( $path ) {
     2570    /**
     2571     * Filters the result of wp_filesize before the PHP function is run.
     2572     *
     2573     * @since 6.0.0
     2574     *
     2575     * @param null|int $size The unfiltered value. Returning an int from the callback bypasses the filesize call.
     2576     * @param string   $path Path to the file.
     2577     */
     2578    $size = apply_filters( 'pre_wp_filesize', null, $path );
     2579
     2580    if ( is_int( $size ) ) {
     2581        return $size;
     2582    }
     2583
     2584    $size = (int) @filesize( $path );
     2585
     2586    /**
     2587     * Filters the size of the file.
     2588     *
     2589     * @since 6.0.0
     2590     *
     2591     * @param int    $size The result of PHP filesize on the file.
     2592     * @param string $path Path to the file.
     2593     */
     2594    return (int) apply_filters( 'wp_filesize', $size, $path );
     2595}
  • trunk/src/wp-admin/includes/image.php

    r52425 r52837  
    211211    $image_meta['original_image'] = wp_basename( $original_file );
    212212
     213    // Add image file size.
     214    $image_meta['filesize'] = wp_filesize( $new_file );
     215
    213216    return $image_meta;
    214217}
     
    236239    // Default image meta.
    237240    $image_meta = array(
    238         'width'  => $imagesize[0],
    239         'height' => $imagesize[1],
    240         'file'   => _wp_relative_upload_path( $file ),
    241         'sizes'  => array(),
     241        'width'    => $imagesize[0],
     242        'height'   => $imagesize[1],
     243        'file'     => _wp_relative_upload_path( $file ),
     244        'filesize' => wp_filesize( $file ),
     245        'sizes'    => array(),
    242246    );
    243247
     
    630634    unset( $metadata['image']['data'] );
    631635
     636    // Capture file size for cases where it has not been captured yet, such as PDFs.
     637    if ( ! isset( $metadata['filesize'] ) && file_exists( $file ) ) {
     638        $metadata['filesize'] = wp_filesize( $file );
     639    }
     640
    632641    /**
    633642     * Filters the generated attachment meta data.
  • trunk/src/wp-admin/includes/media.php

    r52332 r52837  
    33793379        $file_size = $meta['filesize'];
    33803380    } elseif ( file_exists( $file ) ) {
    3381         $file_size = filesize( $file );
     3381        $file_size = wp_filesize( $file );
    33823382    }
    33833383
  • trunk/src/wp-includes/class-wp-image-editor-gd.php

    r52425 r52837  
    498498            'height'    => $this->size['height'],
    499499            'mime-type' => $mime_type,
     500            'filesize'  => wp_filesize( $filename ),
    500501        );
    501502    }
  • trunk/src/wp-includes/class-wp-image-editor-imagick.php

    r52640 r52837  
    730730            'height'    => $this->size['height'],
    731731            'mime-type' => $mime_type,
     732            'filesize'  => wp_filesize( $filename ),
    732733        );
    733734    }
  • trunk/src/wp-includes/media.php

    r52797 r52837  
    40474047        $bytes = $meta['filesize'];
    40484048    } elseif ( file_exists( $attached_file ) ) {
    4049         $bytes = filesize( $attached_file );
     4049        $bytes = wp_filesize( $attached_file );
    40504050    } else {
    40514051        $bytes = '';
  • trunk/src/wp-includes/post.php

    r52795 r52837  
    65396539 *                              'file', 'width', 'height', and 'mime-type'.
    65406540 *     @type array  $image_meta Image metadata.
     6541 *     @type int    $filesize   File size of the attachment.
    65416542 * }
    65426543 */
  • trunk/tests/phpunit/tests/file.php

    r52389 r52837  
    263263        return $keys;
    264264    }
     265
     266    /**
     267     * @ticket 49412
     268     * @covers ::wp_filesize
     269     */
     270    function test_wp_filesize_with_nonexistent_file() {
     271        $file = 'nonexistent/file.jpg';
     272        $this->assertEquals( 0, wp_filesize( $file ) );
     273    }
     274
     275    /**
     276     * @ticket 49412
     277     * @covers ::wp_filesize
     278     */
     279    function test_wp_filesize() {
     280        $file = DIR_TESTDATA . '/images/test-image-upside-down.jpg';
     281
     282        $this->assertEquals( filesize( $file ), wp_filesize( $file ) );
     283
     284        $filter = function() {
     285            return 999;
     286        };
     287
     288        add_filter( 'wp_filesize', $filter );
     289
     290        $this->assertEquals( 999, wp_filesize( $file ) );
     291
     292        $pre_filter = function() {
     293            return 111;
     294        };
     295
     296        add_filter( 'pre_wp_filesize', $pre_filter );
     297
     298        $this->assertEquals( 111, wp_filesize( $file ) );
     299    }
    265300}
  • trunk/tests/phpunit/tests/image/editorGd.php

    r51568 r52837  
    101101                'height'    => 33,
    102102                'mime-type' => 'image/jpeg',
     103                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-50x33.jpg' ),
    103104            ),
    104105        );
     
    301302                'height'    => 7,
    302303                'mime-type' => 'image/jpeg',
     304                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-10x7.jpg' ),
    303305            ),
    304306
     
    309311                'height'    => 50,
    310312                'mime-type' => 'image/jpeg',
     313                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-75x50.jpg' ),
    311314            ),
    312315
     
    317320                'height'    => 20,
    318321                'mime-type' => 'image/jpeg',
     322                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-30x20.jpg' ),
    319323            ),
    320324
     
    325329                'height'    => 400,
    326330                'mime-type' => 'image/jpeg',
     331                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-45x400.jpg' ),
    327332            ),
    328333
     
    333338                'height'    => 33,
    334339                'mime-type' => 'image/jpeg',
     340                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-50x33.jpg' ),
    335341            ),
    336342
     
    341347                'height'    => 37,
    342348                'mime-type' => 'image/jpeg',
     349                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-55x37.jpg' ),
    343350            ),
    344351
     
    349356                'height'    => 55,
    350357                'mime-type' => 'image/jpeg',
     358                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-83x55.jpg' ),
    351359            ),
    352360
     
    357365                'height'    => 60,
    358366                'mime-type' => 'image/jpeg',
     367                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-90x60.jpg' ),
    359368            ),
    360369
     
    365374                'height'    => 70,
    366375                'mime-type' => 'image/jpeg',
     376                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-105x70.jpg' ),
    367377            ),
    368378
     
    373383                'height'    => 133,
    374384                'mime-type' => 'image/jpeg',
     385                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-200x133.jpg' ),
    375386            ),
    376387        );
  • trunk/tests/phpunit/tests/image/editorImagick.php

    r51568 r52837  
    9191                'height'    => 33,
    9292                'mime-type' => 'image/jpeg',
     93                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-50x33.jpg' ),
    9394            ),
    9495        );
     
    290291                'height'    => 7,
    291292                'mime-type' => 'image/jpeg',
     293                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-10x7.jpg' ),
    292294            ),
    293295
     
    298300                'height'    => 50,
    299301                'mime-type' => 'image/jpeg',
     302                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-75x50.jpg' ),
    300303            ),
    301304
     
    306309                'height'    => 20,
    307310                'mime-type' => 'image/jpeg',
     311                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-30x20.jpg' ),
    308312            ),
    309313
     
    314318                'height'    => 400,
    315319                'mime-type' => 'image/jpeg',
     320                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-45x400.jpg' ),
    316321            ),
    317322
     
    322327                'height'    => 33,
    323328                'mime-type' => 'image/jpeg',
     329                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-50x33.jpg' ),
    324330            ),
    325331
     
    330336                'height'    => 37,
    331337                'mime-type' => 'image/jpeg',
     338                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-55x37.jpg' ),
    332339            ),
    333340
     
    338345                'height'    => 55,
    339346                'mime-type' => 'image/jpeg',
     347                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-83x55.jpg' ),
    340348            ),
    341349
     
    346354                'height'    => 60,
    347355                'mime-type' => 'image/jpeg',
     356                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-90x60.jpg' ),
    348357            ),
    349358
     
    354363                'height'    => 70,
    355364                'mime-type' => 'image/jpeg',
     365                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-105x70.jpg' ),
    356366            ),
    357367
     
    362372                'height'    => 133,
    363373                'mime-type' => 'image/jpeg',
     374                'filesize'  => wp_filesize( dirname( $file ) . '/waffles-200x133.jpg' ),
    364375            ),
    365376        );
  • trunk/tests/phpunit/tests/image/functions.php

    r52269 r52837  
    480480        $this->assertNotEmpty( $attachment_id );
    481481
     482        $temp_dir = get_temp_dir();
     483
     484        $metadata = wp_generate_attachment_metadata( $attachment_id, $test_file );
     485
    482486        $expected = array(
    483             'sizes' => array(
     487            'sizes'    => array(
    484488                'full'      => array(
    485489                    'file'      => 'wordpress-gsoc-flyer-pdf.jpg',
     
    487491                    'height'    => 1408,
    488492                    'mime-type' => 'image/jpeg',
     493                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf.jpg' ),
    489494                ),
    490495                'medium'    => array(
     
    493498                    'height'    => 300,
    494499                    'mime-type' => 'image/jpeg',
     500                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-232x300.jpg' ),
    495501                ),
    496502                'large'     => array(
     
    499505                    'height'    => 1024,
    500506                    'mime-type' => 'image/jpeg',
     507                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-791x1024.jpg' ),
    501508                ),
    502509                'thumbnail' => array(
     
    505512                    'height'    => 150,
    506513                    'mime-type' => 'image/jpeg',
     514                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-116x150.jpg' ),
    507515                ),
    508516            ),
    509         );
    510 
    511         $metadata = wp_generate_attachment_metadata( $attachment_id, $test_file );
     517            'filesize' => wp_filesize( $test_file ),
     518        );
     519
    512520        $this->assertSame( $expected, $metadata );
    513521
    514522        unlink( $test_file );
    515         $temp_dir = get_temp_dir();
    516523        foreach ( $metadata['sizes'] as $size ) {
    517524            unlink( $temp_dir . $size['file'] );
     
    550557        $this->assertNotEmpty( $attachment_id );
    551558
     559        $temp_dir = get_temp_dir();
     560
     561        $metadata = wp_generate_attachment_metadata( $attachment_id, $test_file );
     562
    552563        $expected = array(
    553             'sizes' => array(
     564            'sizes'    => array(
    554565                'full'      => array(
    555566                    'file'      => 'wordpress-gsoc-flyer-pdf.jpg',
     
    557568                    'height'    => 1408,
    558569                    'mime-type' => 'image/jpeg',
     570                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf.jpg' ),
    559571                ),
    560572                'medium'    => array(
     
    563575                    'height'    => 300,
    564576                    'mime-type' => 'image/jpeg',
     577                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-300x300.jpg' ),
    565578                ),
    566579                'large'     => array(
     
    569582                    'height'    => 1024,
    570583                    'mime-type' => 'image/jpeg',
     584                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-791x1024.jpg' ),
    571585                ),
    572586                'thumbnail' => array(
     
    575589                    'height'    => 150,
    576590                    'mime-type' => 'image/jpeg',
     591                    'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-116x150.jpg' ),
    577592                ),
    578593            ),
    579         );
    580 
    581         $metadata = wp_generate_attachment_metadata( $attachment_id, $test_file );
     594            'filesize' => wp_filesize( $test_file ),
     595        );
     596
    582597        $this->assertSame( $expected, $metadata );
    583598
    584599        unlink( $test_file );
    585600        foreach ( $metadata['sizes'] as $size ) {
    586             unlink( get_temp_dir() . $size['file'] );
     601            unlink( $temp_dir . $size['file'] );
    587602        }
    588603    }
     
    617632        add_image_size( 'test-size', 100, 100 );
    618633        add_filter( 'fallback_intermediate_image_sizes', array( $this, 'filter_fallback_intermediate_image_sizes' ), 10, 2 );
     634
     635        $metadata = wp_generate_attachment_metadata( $attachment_id, $test_file );
     636
     637        $temp_dir = get_temp_dir();
    619638
    620639        $expected = array(
     
    623642            'height'    => 100,
    624643            'mime-type' => 'image/jpeg',
    625         );
    626 
    627         $metadata = wp_generate_attachment_metadata( $attachment_id, $test_file );
     644            'filesize'  => wp_filesize( $temp_dir . 'wordpress-gsoc-flyer-pdf-77x100.jpg' ),
     645        );
     646
     647        // Different environments produce slightly different filesize results.
     648        $this->assertSame( $metadata['sizes']['test-size'], $expected );
     649
    628650        $this->assertArrayHasKey( 'test-size', $metadata['sizes'], 'The `test-size` was not added to the metadata.' );
    629651        $this->assertSame( $expected, $metadata['sizes']['test-size'] );
     
    633655
    634656        unlink( $test_file );
    635         $temp_dir = get_temp_dir();
    636657        foreach ( $metadata['sizes'] as $size ) {
    637658            unlink( $temp_dir . $size['file'] );
Note: See TracChangeset for help on using the changeset viewer.