How do I get the size of an attachment file?

I’m using the following template code to display attachment links:

$args = array(
    'post_type' => 'attachment',
    'numberposts' => -1,
    'post_status' => null,
    'post_parent' => $main_post_id
);

$attachments = get_posts($args);

foreach ($attachments as $attachment)
{
    the_attachment_link($attachment->ID, false);
}

but after the link I need to display the file’s size. How can I do this?

Read More

I’m guessing I could determine the file’s path (via wp_upload_dir() and a substr() of wp_get_attachment_url()) and call filesize() but that seems messy, and I’m just wondering if there’s a method built into WordPress.

Related posts

Leave a Reply

9 comments

  1. I have used this before in functions.php to display the file size in an easily readable format:

    function getSize($file){
    $bytes = filesize($file);
    $s = array('b', 'Kb', 'Mb', 'Gb');
    $e = floor(log($bytes)/log(1024));
    return sprintf('%.2f '.$s[$e], ($bytes/pow(1024, floor($e))));}
    

    And then in my template:

    echo getSize('insert reference to file here');
    
  2. There’s an easier solution, to get human readable file sizes.

    $attachment_id  = $attachment->ID;
    $attachment_meta = wp_prepare_attachment_for_js($attachment_id);
    
    echo $attachment_meta['filesizeHumanReadable'];
    
  3. To find the size of a file added through the custom fields plugin, I did this:

    $fileObject = get_field( 'file ');
    $fileSize   = size_format( filesize( get_attached_file( $fileObject['id'] ) ) );
    

    Just make sure you set the custom field’s “Return Value” to “File Object”.

  4. I was looking for the same and found this WordPress built-in solution.

    $args = array(
        'post_type' => 'attachment',
        'numberposts' => -1,
        'post_status' => null,
        'post_parent' => $main_post_id
    );
    
    $attachments = get_posts($args);
    
    foreach ($attachments as $attachment)
    {
        $attachment_id = $attachment->ID;
        $image_metadata = wp_get_attachment_metadata( $attachment_id );
        the_attachment_link($attachment->ID, false);
        echo the_attachment_link['width'];
        echo the_attachment_link['height'];
    }
    

    See more at wp_get_attachment_metadata()

  5. For audio at least, the file size is saved as “metadata”.

    $metadata = wp_get_attachment_metadata( $attachment_id );
    echo $metadata['filesize'];
    

    This may not be the case for images and video.

  6. Get image file size in wordpress:

    $query_images_args = array(
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'post_status' => 'inherit',
        'posts_per_page' => 10,
    );
    
    $query_images = new WP_Query($query_images_args);
    
    foreach ($query_images->posts as $image) {
        $img_atts = wp_get_attachment_image_src($image->ID, $default);
        $img = get_headers($img_atts[0], 1);
        $size = $img["Content-Length"]/1024;
        echo round($size);
    
    }
    
  7. Simple function to get attachment file size by attachment id, similar to another answer here but with a little error checking. There is also an additional parameter to specify the number of decimal points to return:

    function tm_get_attachment_size($attachment_id, $decimals) {
        $file = get_attached_file( $attachment_id );
        return $file ? size_format( filesize($file), $decimals ) : 0;
    }
    

    For example, say I have an attachment ID of 99: tm_get_attachment_size(99, 1) would return ‘1.4 MB’.