2012-04-15 2 views
0

Я задавал вопросы по этой теме много recently.Как определить размер файла видео до его загрузки?

я создал мой форма загрузки

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"]) 

и добавить линии settings.py

FILE_UPLOAD_MAX_MEMORY_SIZE = 157286400 # 157286400 bytes = 150 MB 

мне сказали, чтобы использовать this snippet, и я нашел this snippet

Но есть вопрос, который я не видел, пользователь djangosnippets сказать

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. 

см this question. Этот вопрос касается asp.net, я использую django. Итак, как определить размер файла видео до того, как вы его загрузите, в django

+0

«Если вы в порядке, разрешите людям использовать всю вашу пропускную способность для загрузки файлов 1GB на свои серверы, чтобы удалить их, как только загрузка закончится, уверен, что это отличное решение ". Внутренний абонент может отправить запрос POST с данными 1 Гб, а сервер все равно будет получать эти данные: '$ локона -F [email protected] HTTP: // foo.com /' Я верю, что большинство хостинга провайдеры не взимают плату за входящую пропускную способность. –

ответ

2

Вам нужно отключить загрузку HTTP до его попадания в Django, и вы делаете это обычно на вашем интерфейсном веб-сервере, который может быть Apache, Nginx или что-то еще, поэтому этот вопрос не является специфичным для Django.

Однако окончательное решение заключается в использовании HTML5 файла JavaScript API для чтения размера файла на стороне клиента и предотвращая пользователь попасть <form> кнопку отправки, если он/она выбирает слишком большой файл:

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

Поскольку старые браузеры не поддерживают оба метода, вам все равно нужно отменить удаление веб-сервера и предположить, что проверка Javascript не выполняется в каждом браузере.

+0

AFAIK это не стандарт HTML5, но специфический Gecko (Firefox) – Luxspes

+0

+1 для рекомендации API файлов HTML5 – Wes

+1

Он поддерживается хотя бы Firefox, Chrome, Safari и Opera, поэтому я считаю его стандартным :) https: // ru. wikipedia.org/wiki/HTML5_File_API –

-1

только способ определить размер файла видео , прежде чем вы загрузите его с помощью на стороне клиента программирования, вы должны либо написать менеджер загрузки в Silverlight о как Java-апплет (или вспышка) или использовать какой-либо ActiveX o настраиваемый специфический для браузера API

+0

Спасибо за голову, но если интерпретатор это строго, это неверно, потому что браузер уже на протяжении нескольких лет обнаружил Javascript API. Работа с подключаемым модулем - это не единственный способ. –

+0

Согласно http://caniuse.com/#feat = fileapi имеет поддержку только 53.99%. – Luxspes

Смежные вопросы