0

I have been asking questions about this subject a lot recently.

i created my upload form

models.py

from django.db import models
from app.extra import ContentTypeRestrictedFileField

class upload(models.Model):
    """ upload """
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=250)
    file = ContentTypeRestrictedFileField(
        upload_to='/media/videos,'
        content_types=['video/avi', 'video/mp4', 'video/3gp', 'video/wmp', 'video/flv', 'video/mov'],
        max_upload_size=104857600
    )
    created = models.DateTimeField('created', auto_now_add=True)
    modified = models.DateTimeField('modified', auto_now=True)

    def __unicode__(self):
        return self.name

form.py

from django.db.models import FileField
from django.forms import forms
from django.template.defaultfilters import filesizeformat
from django.utils.translation import ugettext_lazy as _

class ContentTypeRestrictedFileField(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, content_types=None,max_upload_size=104857600, **kwargs):
        self.content_types = kwargs.pop('video/avi', 'video/mp4', 'video/3gp', 'video/wmp', 'video/flv', 'video/mov')
        self.max_upload_size = max_upload_size

        super(ContentTypeRestrictedFileField, self).__init__(**kwargs)


    def clean(self, *args, **kwargs):        
        data = super(ContentTypeRestrictedFileField, self).clean(*args, **kwargs)

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

        return data

        from south.modelsinspector import add_introspection_rules
        add_introspection_rules([], ["^app\.extra\.ContentTypeRestrictedFileField"])

and add this line is settings.py

FILE_UPLOAD_MAX_MEMORY_SIZE = 157286400 # 157286400 bytes = 150 MB

i was told to use this snippet, and i found this snippet

But there's an issue that i didn't see, a djangosnippets user say

If you're ok with letting people use up all your bandwidth for uploading 1GB 
files to your servers just to delete them as soon as the upload finishes, 
sure it's a great solution.

see this question. That question is about asp.net, i use django, So how to detect the file size of a video before that you upload it, in django

Community
  • 1
  • 1
user
  • 973
  • 4
  • 14
  • 29
  • "If you're ok with letting people use up all your bandwidth for uploading 1GB files to your servers just to delete them as soon as the upload finishes, sure it's a great solution." An user can send a POST request with 1GB data and the server will still receive this data: `$ curl -F file=@1GB.iso http://foo.com/` I belive that most hosting providers don't charge for the incoming bandwidth. –  Apr 15 '12 at 15:59

2 Answers2

2

You need to cut off HTTP upload before its hit Django and you do this usually on your front-end web server which could be Apache, Nginx or anything so this question is not Django specific.

However the ultimate solution is to use HTML5 Javascript File API to read the file size on the client end and preventing the user to hit <form> submit button if he/she chooses too large file:

https://developer.mozilla.org/en/DOM/File.size

Because older browsers do not support both methods, you still need to fall back webserver cut and assume Javascript validation is not executed on every browser.

Mikko Ohtamaa
  • 82,057
  • 50
  • 264
  • 435
  • AFAIK this is not HTML5 standard, but Gecko (Firefox) specific – Luxspes Apr 15 '12 at 14:19
  • 1
    It is supported at least by Firefox, Chrome, Safari and Opera so I consider it standard :) https://en.wikipedia.org/wiki/HTML5_File_API – Mikko Ohtamaa Apr 15 '12 at 18:15
  • sir, i've never used html5 in django forms before, so please can you explain to me how to use [this snippet](https://developer.mozilla.org/en/DOM/File.size) with [this one](http://djangosnippets.org/snippets/2206/) to limit the file size to lets say 100mb – user Apr 17 '12 at 08:49
  • I am not knighted by Queen of England as far as I know – Mikko Ohtamaa Apr 17 '12 at 15:12
  • Also this would fall category of generic Javascript knowledge. I suggest you read some basic tutorials how to use Javascript and jQuery on your web pages. If I start writing your code I would be doing your work for you for free. – Mikko Ohtamaa Apr 17 '12 at 15:12
-1

The only way to detect the file size of a video before you upload it is using client side programming, you either have to write an upload manager in Silverlight o as a Java Applet (or in Flash) or use some ActiveX o custom browser specific API

Luxspes
  • 6,268
  • 2
  • 28
  • 31
  • Thanks for the head ups, but if interpreter this strictly this is untrue because browser have exposed Javascript APIs for this few years now - doing with plug-in is not the only way – Mikko Ohtamaa Apr 15 '12 at 18:19