उपयोगकर्ताओं को अधिकतम अपलोड क्षमता दें; उपयोगकर्ता द्वारा अपलोड की जा सकने वाली फ़ाइलों की संख्या को सीमित करें या प्रति अपलोड फ़ाइलों की संख्या को सीमित करें


9

मैं अपनी वेबसाइट के सामने के छोर पर मीडिया लाइब्रेरी का उपयोग कर रहा हूं और मैं उपयोगकर्ताओं को असीमित संख्या में फाइलें अपलोड करके अपने सर्वर को स्पैम करने से रोकना चाहूंगा।

जैसे, मैं नीचे एक या शायद सभी करना चाहूंगा:

  1. उपयोगकर्ताओं को अधिकतम अपलोड क्षमता दें; यानी उपयोगकर्ता 10 मेगाबाइट तक की फाइलें अपलोड कर सकते हैं।
  2. उन फ़ाइलों की संख्या को सीमित करें जिन्हें एक उपयोगकर्ता प्रति-पोस्ट आधार पर अपलोड कर सकता है
  3. एक उपयोगकर्ता द्वारा अपलोड की जा सकने वाली फ़ाइलों की संख्या को सीमित करें जब वे "इन्सर्ट" बटन पर क्लिक करते हैं, अर्थात फ़्लैश अपलोडर और क्लासिक अपलोडर आपको केवल एक समय में 2 फ़ाइलों को अपलोड करने देगा।

इनमें से कोई भी बुलेट-प्रूफ नहीं है, लेकिन वे उम्मीद करते हैं कि ऐसे "स्पैमिंग" को एक मुश्किल बना दिया जाएगा।

अग्रिम में धन्यवाद,

जवाबों:


11

यह मानते हुए कि आप वर्डप्रेस के मूल कार्यों, इसी तरह wp_handle_uploadया कुछ और उच्च-स्तर के माध्यम से अपलोड कार्यक्षमता प्रदान कर रहे हैं , हम इस निष्कर्ष पर आते हैं कि कई हुक खींचे जाने वाले हैं।

http://core.trac.wordpress.org/browser/tags/3.3/wp-admin/includes/file.php#L212

wp_handle_uploadसमारोह शायद आखिरी देशी समारोह फ़ाइल को छूने के लिए होगा, और सभी जानकारी आवश्यक है कि का ट्रैक रखने के पता होगा।

इस फ़ंक्शन के अंदर दो हुक रुचि के हैं: wp_handle_uploadऔर wp_handle_upload_prefilter। उत्तरार्द्ध पहले आता है, यह वर्तमान सीमाओं के खिलाफ जांच कर सकता है और फ़ाइल को अपलोड होने से रोक सकता है। पूर्व फ़ाइल ट्रैक और गणना करेगा। जानकारी संग्रहीत करने के अलावा अन्य किसी के द्वारा नियंत्रित किया जाएगा update_user_meta

add_filter( 'wp_handle_upload', 'wpse47580_update_upload_stats' );
function wpse47580_update_upload_stats( $args ) {
    $file = $args['file'];
    $size = filesize( $file ); // bytes

    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, 'upload_count', $single = true );
    $upload_bytes = get_user_meta( $user_id, 'upload_bytes', $single = true );

    update_user_meta( $user_id, 'upload_count', $upload_count + 1 );
    update_user_meta( $user_id, 'upload_bytes', $upload_bytes + $size );
}

add_filter( 'wp_handle_upload_prefilter', 'wpse47580_check_upload_limits' );
function wpse47580_check_upload_limits( $file ) {
    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, 'upload_count', $single = true );
    $upload_bytes = get_user_meta( $user_id, 'upload_bytes', $single = true );

    $filesize = /* get filesize from $file array */;
    $upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
    $upload_count_limit_reached = apply_filters( 'wpse47580_upload_count_limit_reached', 100 ) > ( $upload_count + 1 );

    if ( $upload_count_limit_reached || $upload_bytes_limit_reached )
        $file['error'] = 'Upload limit has been reached for this account!';

    return $file;
}

सैद्धांतिक रूप से, यह काम करता है; व्यावहारिक रूप से - अप्रयुक्त। आईये जानते हैं कि यह कैसा रहेगा।

पोस्ट मेटा में प्रति अपलोड अपलोड सीमाएं रखी जाएंगी, शायद जैसे {$user_id}_upload_countआदि। यह न देखें कि यह काम क्यों नहीं करेगा।

यदि आप अपलोड को संभालने के लिए कस्टम कोड का उपयोग कर रहे हैं (जो मैं दोगुना हो जाता है), तो आप अपने कार्यों और फ़िल्टर को उसी तरह लागू कर सकते हैं wp_handle_uploads


हाय आत्मा - उत्कृष्ट पोस्ट, बहुत बहुत धन्यवाद। मुझे अब यह काम मिल रहा है। क्या आप बता सकते हैं कि ये लाइनें क्या करती हैं? $upload_bytes_limit_reached = apply_filters( 'wpse47580_upload_bytes_limit_reached', 1024*1024*10 ) > ( $filesize + $upload_bytes );
dunc

मैंने उन लाइनों को बदलने के लिए कोड को अपडेट किया है जो मैंने अभी बताई हैं, क्योंकि वे मुझे समस्याएं पैदा कर रहे थे - मुझे लगता है कि मैं एक फिल्टर फ़ंक्शन को याद कर रहा हूं, लेकिन मुझे यकीन नहीं है कि मुझे इसके साथ क्या करना है! मैंने एक उत्तर के रूप में अपना कोड पोस्ट किया है, क्या आप इसकी आलोचना कर सकते हैं?
dunc

apply_filtersकोड अन्य प्लग-इन वहाँ में हुक करने की अनुमति होगी, सोचा था कि उपयोगी होगा। क्या आप समस्याओं की प्रकृति का वर्णन कर सकते हैं?
आत्मासेकाह

1
आपको wp_handle_upload में $ args वापस करना होगा या छवि सहेजी नहीं जाएगी!
skylarkcob

इसके अलावा, कुछ कोड होने चाहिए जो अटैचमेंट डिलीट करने के लिए और upload_count और upload_bytes मेटा फ़ील्ड को कम करने के लिए संभालेंगे।
स्वेतोस्लाव मारिनोव

1

मैंने सोलेसेका के कोड में कुछ संशोधन किया है क्योंकि apply_filterचर मेरे लिए काम नहीं कर रहे थे - शायद इसलिए क्योंकि मैं उन्हें नहीं समझता!

# [File Upload]
#
# Two filters to give users a maximum upload limit of 10Mb and 100 files.
# This function runs after the file has been uploaded.
add_filter( 'wp_handle_upload', 'wpse47580_update_upload_stats' );
function wpse47580_update_upload_stats( $args ) {
    $size = filesize( $args['file'] );

    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, 'upload_count', true );
    $upload_bytes = get_user_meta( $user_id, 'upload_bytes', true );

    update_user_meta( $user_id, 'upload_count', $upload_count + 1 );
    update_user_meta( $user_id, 'upload_bytes', $upload_bytes + $size );
}

# This function runs before the file is uploaded.
add_filter( 'wp_handle_upload_prefilter', 'wpse47580_check_upload_limits' );
function wpse47580_check_upload_limits( $file ) {
    $user_id = get_current_user_id();

    $upload_count = get_user_meta( $user_id, 'upload_count', true );
    $upload_bytes = get_user_meta( $user_id, 'upload_bytes', true );

    $filesize = $file['size']; // bytes

    $upload_bytes_limit_reached = ( ( $filesize + $upload_bytes ) > ( 1024 * 1024 * 10 ) );

    $upload_count_limit_reached = ( $upload_count + 1 ) > 100;

    if ( $upload_count_limit_reached || $upload_bytes_limit_reached )
        $file['error'] = 'Upload limit has been reached for this account!';

    return $file;
}

यह एक प्लगइन बनाने के लिए वास्तव में सरल होगा, इसलिए मैं इसे भविष्य में किसी बिंदु पर जारी कर सकता हूं, जब मैंने इसके लिए एक इंटरफ़ेस विकसित किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.