Impose a Maximum Limit on Image height and width upload size

Clients have been uploading huuuge images, then complaining that the server is running out of memory.

Ofcourse one could bump the amount of memory, but this just introduces an arms race.

Read More

What hooks can I add to impose a maximum image size ( dimensions, not filesize ) on files uploaded, e.g. No you can’t upload that 8 Megapixel shot, resize it first to < 2 Megapixels.

To be clear, I am talking about image size, not file size, aka Image height, and Image width

Related posts

Leave a Reply

3 comments

  1. Basically you just retrieve the info via getimagesize(), a basic PHP function, a then handle your errors with notes.

    The plugin

    A basic plugin as a starting point:

    <?php
    /** Plugin Name: (#67107) »kaiser« Restrict file upload via image dimensions */
    
    function wpse67107_restrict_upload( $file )
    {
        $file_data = getimagesize( $file );
        // Handle cases where we can't get any info:
        if ( ! $file_data )
            return $file;
    
        list( $width, $height, $type, $hwstring, $mime, $rgb_r_cmyk, $bit ) = $file_data;
    
        // Add conditions when to abort
        if ( 3200728 < $width * $height )
        {
            // I added 100k as sometimes, there are more rows/columns 
            // than visible pixels, depending on the format
            $file['error'] = 'This image is too large, resize it prior to uploading, ideally below 3.2MP or 2048x1536 px.';
        }
    
        return $file;
    }
    add_filter( 'wp_handle_upload_prefilter', 'wpse67107_restrict_upload' );
    
  2. Here’s my take on it

    <?php
    /**
     * Plugin Name: Deny Giant Image Uploads
     * Description: Prevents Uploads of images greater than 3.2MP
     */
    
    function tomjn_deny_giant_images($file){
        $type = explode('/',$file['type']);
    
        if($type[0] == 'image'){
            list( $width, $height, $imagetype, $hwstring, $mime, $rgb_r_cmyk, $bit ) = getimagesize( $file['tmp_name'] );
            if($width * $height > 3200728){ // I added 100,000 as sometimes there are more rows/columns than visible pixels depending on the format
                $file['error'] = 'This image is too large, resize it prior to uploading, ideally below 3.2MP or 2048x1536';
            }
        }
        return $file;
    }
    add_filter('wp_handle_upload_prefilter','tomjn_deny_giant_images');
    
  3. I understand that you only need to deny uploads based on Image Dimension. But I just want to add a note, this will not prevent your server from getting Out of Memory. Image dimensions is available once the data has been fully uploaded on the server (like Apache), and hence server memory is consumed.

    You should consider limiting the Upload size at Apache and PHP level, and then if you want, you can also restrict at WordPress level for Image Dimension.
    To set the max upload size in Apache,

    <Directory "/var/www/wordpress-site/wp-uploads">
        LimitRequestBody 10485760
    </Directory>
    

    In php.ini, set:

    memory_limit = 64M
    upload_max_filesize = 10M
    post_max_size = 20M