web-dev-qa-db-ja.com

画像の高さと幅のアップロードサイズに最大制限を課す

クライアントは大量の画像をアップロードしていて、サーバのメモリが不足していると訴えています。

もちろん、記憶の量を増やすこともできますが、これは単に軍拡競争を招くだけです。

アップロードされたファイルに最大の画像サイズ(ファイルサイズではなく、サイズ)を課すために追加できるフック、たとえばいいえ、8メガピクセルのショットをアップロードすることはできません。最初に2メガピクセル未満にサイズ変更してください。

明確にするために、私はファイルサイズではなく画像サイズ、別名画像の高さ、そして画像の幅について話しています。

3
Tom J Nowell

基本的には、基本的なPHP関数である getimagesize() で情報を取得するだけで、エラーをメモで処理できます。

プラグイン

出発点としての基本的なプラグイン:

<?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' );
6
kaiser

これが私の考えです

<?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');
2
Tom J Nowell

Image Dimension に基づいてアップロードを拒否するだけでよいことを私は理解しています。しかし、私はただメモを追加したいのですが、これはあなたのサーバーが メモリ不足 を取得するのを妨げることはありません。 Image dimensionsは、データがサーバーに完全にアップロードされると(Apacheのように)使用可能になるため、サーバーのメモリーが消費されます。

アップロードサイズをApacheおよびPHPレベルで制限することを検討し、必要に応じてWordpressレベルでImage Dimensionを制限することもできます。 Apacheで最大アップロードサイズを設定するには、

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

Php.iniで、次のように設定します。

memory_limit = 64M
upload_max_filesize = 10M
post_max_size = 20M
0
Ravi Kumar