Django फ़ाइल अपलोड आकार सीमा



file-upload (6)

सर्वर साइड

यह जांचने की मेरी पसंदीदा विधि कि फ़ाइल बहुत बड़ी सर्वर-साइड है, अगर वैधकर्ता का उपयोग करते हुए ifedapo olarewaju का जवाब है ।

ग्राहक की ओर

सर्वर-साइड सत्यापन के साथ समस्या यह है कि अपलोड पूर्ण होने के बाद ही सत्यापन होता है। कल्पना कीजिए, एक बड़ी फाइल अपलोड करना, उम्र के लिए इंतजार करना, केवल बाद में बताया जाना चाहिए कि फ़ाइल बहुत बड़ी है। अगर यह ब्राउज़र मुझे पहले से ही बता सकता है कि फ़ाइल बहुत बड़ी है तो क्या यह अच्छा नहीं होगा?

खैर, एचटीएमएल 5 फाइल एपीआई का उपयोग करके, इस ग्राहक पक्ष के लिए एक रास्ता है!

यहां आवश्यक जावास्क्रिप्ट (JQuery के आधार पर) है:

$("form").submit(function() {
  if (window.File && window.FileReader && window.FileList && window.Blob) {
    var file = $('#id_file')[0].files[0];

    if (file && file.size > 2 * 1024 * 1024) {
      alert("File " + file.name + " of type " + file.type + " is too big");
      return false;
    }
  }
});

बेशक, आपको दुर्भावनापूर्ण इनपुट के विरुद्ध सुरक्षा के लिए सर्वर-साइड सत्यापन की आवश्यकता है, और जिन उपयोगकर्ताओं के पास जावास्क्रिप्ट सक्षम नहीं है।

https://src-bin.com

मेरे पास मेरे django ऐप में एक फॉर्म है जहां उपयोगकर्ता फाइल अपलोड कर सकते हैं।
मैं अपलोड किए गए फ़ाइल आकार की सीमा कैसे निर्धारित कर सकता हूं ताकि यदि कोई उपयोगकर्ता मेरी सीमा से बड़ी फ़ाइल अपलोड करता है तो फॉर्म मान्य नहीं होगा और यह एक त्रुटि फेंक देगा?


Answer #1

अगर कोई FileField एंजेलो समाधान का फॉर्मफिल्ल्ड संस्करण ढूंढ रहा है तो यहां यह है

from django import forms
from django.template.defaultfilters import filesizeformat
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ValidationError

class RestrictedFileField(forms.FileField):
    """
    Same as FileField, but you can specify:
    * content_types - list containing allowed content_types. Example: ['application/pdf', 'image/jpeg']
    * max_upload_size - a number indicating the maximum file size allowed for upload.
        2.5MB - 2621440
        5MB - 5242880
        10MB - 10485760
        20MB - 20971520
        50MB - 5242880
        100MB - 104857600
        250MB - 214958080
        500MB - 429916160
"""

    def __init__(self, *args, **kwargs):
        self.content_types = kwargs.pop("content_types")
        self.max_upload_size = kwargs.pop("max_upload_size")

        super(RestrictedFileField, self).__init__(*args, **kwargs)

    def clean(self, data, initial=None):
        file = super(RestrictedFileField, self).clean(data, initial)

        try:
            content_type = file.content_type
            if content_type in self.content_types:
                if file._size > self.max_upload_size:
                    raise ValidationError(_('Please keep filesize under %s. Current filesize %s') % (
                        filesizeformat(self.max_upload_size), filesizeformat(file._size)))
            else:
                raise ValidationError(_('Filetype not supported.'))
        except AttributeError:
            pass

        return data

फिर के रूप में एक फार्म बनाएँ

class ImageUploadForm(forms.Form):
    """Image upload form."""
    db_image = RestrictedFileField(content_types=['image/png', 'image/jpeg'],
                                   max_upload_size=5242880)

Answer #2

इस धागे में शामिल स्निपेट पर बस एक छोटा सा नोट:

इस स्निपेट पर एक नज़र डालें: http://www.djangosnippets.org/snippets/1303/

यह बहुत उपयोगी था, हालांकि इसमें कुछ मामूली गलतियों को शामिल किया गया है। अधिक मजबूत कोड इस तरह दिखना चाहिए:

# Add to your settings file
CONTENT_TYPES = ['image', 'video']
# 2.5MB - 2621440
# 5MB - 5242880
# 10MB - 10485760
# 20MB - 20971520
# 50MB - 5242880
# 100MB - 104857600
# 250MB - 214958080
# 500MB - 429916160
MAX_UPLOAD_SIZE = "5242880"

#Add to a form containing a FileField and change the field names accordingly.
from django.template.defaultfilters import filesizeformat
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
def clean_content(self):
    if content != None:
        content = self.cleaned_data['content']
        content_type = content.content_type.split('/')[0]
        if content_type in settings.CONTENT_TYPES:
            if content._size > int(settings.MAX_UPLOAD_SIZE):
                raise forms.ValidationError(_(u'Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.MAX_UPLOAD_SIZE), filesizeformat(content._size)))
        else:
            raise forms.ValidationError(_(u'File type is not supported'))
        return content

कुछ सुधार हैं:

सबसे पहले मैं यह पता लगा रहा हूं कि फ़ाइल फ़ील्ड खाली है (कोई नहीं) - इसके बिना, Django वेब ब्राउज़र में अपवाद डालेगा।

अगला int (settings.MAX_UPLOAD_SIZE) में टाइप कास्टिंग है, क्योंकि सेटिंग सेटिंग एक स्ट्रिंग है। संख्याओं की तुलना करने के लिए स्ट्रिंग का उपयोग नहीं किया जा सकता है।

अंतिम लेकिन कम से कम नहीं, ValidationError फ़ंक्शन में यूनिकोड 'यू' उपसर्ग।

इस स्निपेट के लिए बहुत बहुत धन्यवाद!


Answer #3

एक और समाधान वैधकर्ताओं का उपयोग कर रहा है

from django.core.exceptions import ValidationError

def file_size(value): # add this to some file where you can import it from
    limit = 2 * 1024 * 1024
    if value.size > limit:
        raise ValidationError('File too large. Size should not exceed 2 MiB.')

फिर फ़ाइल फ़ील्ड के साथ आपके फॉर्म में आपके पास ऐसा कुछ है

image = forms.FileField(required=False, validators=[file_size])

Answer #4

यह कोड मदद कर सकता है:

# Add to your settings file
CONTENT_TYPES = ['image', 'video']
# 2.5MB - 2621440
# 5MB - 5242880
# 10MB - 10485760
# 20MB - 20971520
# 50MB - 5242880
# 100MB 104857600
# 250MB - 214958080
# 500MB - 429916160
MAX_UPLOAD_SIZE = "5242880"

#Add to a form containing a FileField and change the field names accordingly.
from django.template.defaultfilters import filesizeformat
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
def clean_content(self):
    content = self.cleaned_data['content']
    content_type = content.content_type.split('/')[0]
    if content_type in settings.CONTENT_TYPES:
        if content._size > settings.MAX_UPLOAD_SIZE:
            raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.MAX_UPLOAD_SIZE), filesizeformat(content._size)))
    else:
        raise forms.ValidationError(_('File type is not supported'))
    return content

से लिया गया: Django Snippets - फ़ाइल सामग्री प्रकार और आकार द्वारा मान्य करें


Answer #5
from django.forms.utils import ErrorList

class Mymodelform(forms.ModelForm):
    class Meta:
        model = Mymodel
        fields = '__all__'

    def clean(self):image = self.cleaned_data.get('image')
        # 5MB - 5242880
        if org_image._size > 5242880:            
            self._errors["image"] = ErrorList([u"Image too heavy."])




file-upload