Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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.

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

share|improve this question
add comment

3 Answers

up vote 5 down vote accepted

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' );
share|improve this answer
    
I'm aware of getimagesize =p –  Tom J Nowell Oct 4 '12 at 11:50
add comment

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
share|improve this answer
2  
Ah but the problem is that while I can upload say a 10MB jpeg, it is not 10MB in memory when it's decompressed into a RAW image in RAM for processing. For example a 30kx30k pixel white image with no detail is huge in memory, but as a PNG file it's <1kb thanks to compression (30000x30000x4(rgba)x4(bytes for each channel) = 14400000000 bytes or 14062500kb or 13732MB or 13GB –  Tom J Nowell Oct 4 '12 at 13:36
add comment

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');
share|improve this answer
    
Aside from different expression of your function, whats the difference between this and Kaiser's answer? –  userabuser Oct 4 '12 at 11:51
    
@kaiser answer limits based on maximum heights and widths, whereas mine limits based on maximum area. So my code would allow a 10x3000 longcat image (0.03MP), Kaisers wouldn't. –  Tom J Nowell Oct 4 '12 at 11:56
    
Also my code has a more descriptive error message –  Tom J Nowell Oct 4 '12 at 12:00
    
There was that, and mine checks if the file is an image before grabbing the size, his doesn't –  Tom J Nowell Oct 4 '12 at 12:08
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.