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. 


Built from https://develop.svn.wordpress.org/trunk@52837


git-svn-id: http://core.svn.wordpress.org/trunk@52426 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
spacedmonkey 2022-03-10 13:10:02 +00:00
parent 8771a658ad
commit bbf017e550
8 changed files with 57 additions and 7 deletions

View File

@ -2555,3 +2555,41 @@ function wp_opcache_invalidate( $filepath, $force = false ) {
return false; return false;
} }
/**
* Wrapper for PHP filesize with filters and casting the result as an integer.
*
* @since 6.0.0
*
* @link https://www.php.net/manual/en/function.filesize.php
*
* @param string $path Path to the file.
* @return int The size of the file in bytes, or 0 in the event of an error.
*/
function wp_filesize( $path ) {
/**
* Filters the result of wp_filesize before the PHP function is run.
*
* @since 6.0.0
*
* @param null|int $size The unfiltered value. Returning an int from the callback bypasses the filesize call.
* @param string $path Path to the file.
*/
$size = apply_filters( 'pre_wp_filesize', null, $path );
if ( is_int( $size ) ) {
return $size;
}
$size = (int) @filesize( $path );
/**
* Filters the size of the file.
*
* @since 6.0.0
*
* @param int $size The result of PHP filesize on the file.
* @param string $path Path to the file.
*/
return (int) apply_filters( 'wp_filesize', $size, $path );
}

View File

@ -210,6 +210,9 @@ function _wp_image_meta_replace_original( $saved_data, $original_file, $image_me
// Store the original image file name in image_meta. // Store the original image file name in image_meta.
$image_meta['original_image'] = wp_basename( $original_file ); $image_meta['original_image'] = wp_basename( $original_file );
// Add image file size.
$image_meta['filesize'] = wp_filesize( $new_file );
return $image_meta; return $image_meta;
} }
@ -235,10 +238,11 @@ function wp_create_image_subsizes( $file, $attachment_id ) {
// Default image meta. // Default image meta.
$image_meta = array( $image_meta = array(
'width' => $imagesize[0], 'width' => $imagesize[0],
'height' => $imagesize[1], 'height' => $imagesize[1],
'file' => _wp_relative_upload_path( $file ), 'file' => _wp_relative_upload_path( $file ),
'sizes' => array(), 'filesize' => wp_filesize( $file ),
'sizes' => array(),
); );
// Fetch additional metadata from EXIF/IPTC. // Fetch additional metadata from EXIF/IPTC.
@ -629,6 +633,11 @@ function wp_generate_attachment_metadata( $attachment_id, $file ) {
// Remove the blob of binary data from the array. // Remove the blob of binary data from the array.
unset( $metadata['image']['data'] ); unset( $metadata['image']['data'] );
// Capture file size for cases where it has not been captured yet, such as PDFs.
if ( ! isset( $metadata['filesize'] ) && file_exists( $file ) ) {
$metadata['filesize'] = wp_filesize( $file );
}
/** /**
* Filters the generated attachment meta data. * Filters the generated attachment meta data.
* *

View File

@ -3378,7 +3378,7 @@ function attachment_submitbox_metadata() {
if ( isset( $meta['filesize'] ) ) { if ( isset( $meta['filesize'] ) ) {
$file_size = $meta['filesize']; $file_size = $meta['filesize'];
} elseif ( file_exists( $file ) ) { } elseif ( file_exists( $file ) ) {
$file_size = filesize( $file ); $file_size = wp_filesize( $file );
} }
if ( ! empty( $file_size ) ) { if ( ! empty( $file_size ) ) {

View File

@ -497,6 +497,7 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
'width' => $this->size['width'], 'width' => $this->size['width'],
'height' => $this->size['height'], 'height' => $this->size['height'],
'mime-type' => $mime_type, 'mime-type' => $mime_type,
'filesize' => wp_filesize( $filename ),
); );
} }

View File

@ -729,6 +729,7 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
'width' => $this->size['width'], 'width' => $this->size['width'],
'height' => $this->size['height'], 'height' => $this->size['height'],
'mime-type' => $mime_type, 'mime-type' => $mime_type,
'filesize' => wp_filesize( $filename ),
); );
} }

View File

@ -4046,7 +4046,7 @@ function wp_prepare_attachment_for_js( $attachment ) {
if ( isset( $meta['filesize'] ) ) { if ( isset( $meta['filesize'] ) ) {
$bytes = $meta['filesize']; $bytes = $meta['filesize'];
} elseif ( file_exists( $attached_file ) ) { } elseif ( file_exists( $attached_file ) ) {
$bytes = filesize( $attached_file ); $bytes = wp_filesize( $attached_file );
} else { } else {
$bytes = ''; $bytes = '';
} }

View File

@ -6538,6 +6538,7 @@ function wp_delete_attachment_files( $post_id, $meta, $backup_sizes, $file ) {
* @type array $sizes Keys are size slugs, each value is an array containing * @type array $sizes Keys are size slugs, each value is an array containing
* 'file', 'width', 'height', and 'mime-type'. * 'file', 'width', 'height', and 'mime-type'.
* @type array $image_meta Image metadata. * @type array $image_meta Image metadata.
* @type int $filesize File size of the attachment.
* } * }
*/ */
function wp_get_attachment_metadata( $attachment_id = 0, $unfiltered = false ) { function wp_get_attachment_metadata( $attachment_id = 0, $unfiltered = false ) {

View File

@ -16,7 +16,7 @@
* *
* @global string $wp_version * @global string $wp_version
*/ */
$wp_version = '6.0-alpha-52836'; $wp_version = '6.0-alpha-52837';
/** /**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.