web-dev-qa-db-ja.com

アップロード時の画像解像度を制限する

特に巨大なイメージが原因で、メモリの問題のためにVPSサーバーが再起動しています。この設定は私の手の届かないところにあります。ホストのフェイルセーフのようなものです。

私は300Mのメモリを備えたVPSを持っています。それは私のWordPressのインストールには十分で、少なくとも日々の操作で十分だと思います。

私がアップロードしている画像は、ファイルサイズ(〜380 kb)はそれほど大きくなく、大部分は黒く、白い文字が入っています。しかし、その解像度は4583 * 4583です。WordPressでアップロードすると、アップロードウィンドウにHTTPエラーが表示されます。ライブサイトを確認すると、数分間停止します。

画像の解像度を検出してアップロードできないようにすることは可能かどうかと思いました。私は画像プロセッサを少し混乱させるほど賢いですが、私の何人かの作者はこれほど大きなものをアップロードする前に画像を処理するのに十分精通していないかもしれません。

ピクセルあたりの画像のビット数に基づいて制限を設定することができればさらに良いでしょうが、私のサーバーの制限が何であるか分からないので、画像が大きいためアップロードできないというエラーメッセージを推測します。たとえば、2000 * 2000で十分です。

5
Marc Dingena

クライアントとサーバー間のネットワーク接続が問題なので、アップロード自体は問題ではありません。サーバーのメモリを消費しているわけではありません。

WordPressが画像の「整理」を開始すると、そこにPHPが入り、アップロードされた画像のサイズ変更と切り取りが開始されます。この瞬間の前に、あなたはPHPがあなたの記憶を食べ尽くすことを可能にする前に、あなたが足を踏み入れて、いくつかのチェックを行う必要がある。

wp_handle_upload_prefilter フィルターを使用して、クランチしようとしている画像に対して任意のチェックを実行する関数をフックできます。

<?php 
/* Marc Dingena Utilities
 * Test image resolution before image crunch
 */
add_filter('wp_handle_upload_prefilter','mdu_validate_image_size');
function mdu_validate_image_size( $file ) {
    $image = getimagesize($file['tmp_name']);
    $minimum = array(
        'width' => '400',
        'height' => '400'
    );
    $maximum = array(
        'width' => '2000',
        'height' => '2000'
    );
    $image_width = $image[0];
    $image_height = $image[1];

    $too_small = "Image dimensions are too small. Minimum size is {$minimum['width']} by {$minimum['height']} pixels. Uploaded image is $image_width by $image_height pixels.";
    $too_large = "Image dimensions are too large. Maximum size is {$maximum['width']} by {$maximum['height']} pixels. Uploaded image is $image_width by $image_height pixels.";

    if ( $image_width < $minimum['width'] || $image_height < $minimum['height'] ) {
        // add in the field 'error' of the $file array the message 
        $file['error'] = $too_small; 
        return $file;
    }
    elseif ( $image_width > $maximum['width'] || $image_height > $maximum['height'] ) {
        //add in the field 'error' of the $file array the message
        $file['error'] = $too_large; 
        return $file;
    }
    else
        return $file;
}
?>
10
Marc Dingena

プラグインの場合は、 http://wordpress.org/plugins/imsanity/ を試してください。そうすれば、他のサイトユーザーが大きすぎる画像をアップロードするのを防ぐことができます。

Imsanity は、巨大な画像のアップロードをブラウザでの表示に適したサイズに自動的にサイズ変更しますが、それでも通常のWebサイトでの使用には十分なサイズを超えます。プラグインは最大幅、高さと品質で設定可能です。寄稿者が設定されたサイズよりも大きい画像をアップロードすると、Imsanityは自動的にそれを設定されたサイズに縮小し、元の画像を置き換えます。

2
markratledge

このタスクを実行するのに十分なメモリがサーバーにある可能性がありますが、PHPメモリ制限の設定が非常に大きなイメージを変換するジョブには低すぎる可能性があります。

Php.iniのmemory_limitを高く設定してみてください。

memory_limit=256M

*注意:これはホスティング環境によっては適切な解決策ではないかもしれません。

0
squarecandy