2011-06-01 100 views
40

我的表單中有一個ImageField。我將如何執行的文件大小最小/最大,像 -文件上傳的最大圖像大小

image = forms.ImageField(max_size = 2MB) 

image = forms.ImageField(min_size = 100k) 

謝謝。

+0

可能重複的[Django的文件上傳大小限制(http://stackoverflow.com/questions/2472422/django-file-upload-size-limit) – 2015-07-02 06:50:50

回答

48

models.py

class Product(models.Model): 
    image = models.ImageField(upload_to="https://stackoverflow.com/a/b/c/") 

forms.py

class ProductForm(forms.ModelForm): 
    # Add some custom validation to our image field 
    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if image: 
      if image._size > 4*1024*1024: 
       raise ValidationError("Image file too large (> 4mb)") 
      return image 
     else: 
      raise ValidationError("Couldn't read uploaded image") 
+0

forms.py代碼中第4行不應該有冒號,但它不會讓我對小於6個字符進行更改。如果您要複製並粘貼此代碼,請小心(不要複製並粘貼任何代碼)。 – 2011-11-01 00:50:42

+3

如果有人對這個答案感興趣,[我寫了一篇博客文章,在通過URL上傳圖片時涉及圖片驗證](http://timmyomahony.com/blog/upload-and-validate-image-from -url-in-django /) – 2014-06-23 11:26:11

+1

等一下,這是上傳整個圖像的第一次,還是它必須先通過?請問http服務器,即nginx在這個驗證發生之前是否會將其視爲413? – radtek 2014-09-17 16:30:01

45

本質上講,這是Django File upload size limit

重複你有兩個選擇:在Django

  1. 使用驗證檢查上傳文件的大小。這種方法的問題在於,文件必須在被驗證之前完全上傳。這意味着如果有人上傳1TB文件,在用戶出現表單錯誤之前,您可能會用盡硬盤空間。

  2. 配置Web服務器以限制允許的上傳主體大小。例如如果使用Apache,請設置LimitRequestBody設置。如果用戶試圖上傳太多,這將意味着,他們將作爲@pastylegs說,在評論中,利用兩者的結合可能是最好的辦法得到一個錯誤頁面配置Apache中

。假設您最多需要5MB,可能在Web服務器級別實施了20MB的限制,並且在Django級別實施了5MB限制。 20MB的限制將爲惡意用戶提供一定的保護,而Django的5MB限制提供了良好的用戶體驗。

+1

甲兩者的混合可能是一個好主意。通過apache/nginx等(50mb可能)將所有上傳限制在合理的範圍內,然後在應用程序級別將其更具體化 – 2011-06-01 03:01:52

+0

@pastylegs我同意,這也是我應該採取的方法。 – 2011-06-01 03:05:07

21

這裏是另一種選擇,我沒碰到過計算器上這個問題的變化看:使用自定義驗證器在你的模型中。如果你在forms.py中使用這種技術和ModelForm,那麼這應該是你所需要的。

models.py

from django.core.exceptions import ValidationError 

class Product(models.Model): 
    def validate_image(fieldfile_obj): 
     filesize = fieldfile_obj.file.size 
     megabyte_limit = 5.0 
     if filesize > megabyte_limit*1024*1024: 
      raise ValidationError("Max file size is %sMB" % str(megabyte_limit)) 

    image = models.ImageField(upload_to="https://stackoverflow.com/a/b/c/", validators=[validate_image]) 
+2

只是爲了澄清,這將在驗證之前全部上傳文件,對嗎?在這種情況下,我同意bradley.ayers,您還應該設置一個Web服務器限制 – Maxim 2016-08-04 14:50:29