2012-04-15 125 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 文件到你的服务器上,只要上传完成就删除它们, 确定它是一个很好的解决方案“ 的用户可以拥有1GB的数据发送POST请求,服务器将仍然收到这样的数据: '$卷曲-F [email protected]的http:// foo.com /' 我相信,大多数托管提供商不收取传入带宽费用。 – 2012-04-15 15:59:39

回答

2

你需要切断它的HTTP Django之前,它通常会这样做在你的前端Web服务器上可能是Apache,Nginx或其他任何东西,所以这个问题不是Django特有的。

然而最终的解决方案是使用HTML5 JavaScript文件API来读取在客户端文件大小和防止用户打<form>提交按钮,如果他/她选择过大的文件:

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

由于旧版浏览器不支持这两种方法,因此您仍然需要回退网络服务器,并假定每个浏览器都未执行JavaScript验证。

+0

AFAIK这不是HTML5标准,但是Gecko(Firefox)具体 – Luxspes 2012-04-15 14:19:58

+0

+1用于推荐HTML5文件API – Wes 2012-04-15 17:09:14

+1

它至少由Firefox,Chrome,Safari和Opera支持,所以我认为它是标准的:) https:// en。 wikipedia.org/wiki/HTML5_File_API – 2012-04-15 18:15:31

-1

检测视频的文件大小,然后上传它使用客户端编程只有方式,你要么必须写在Silverlight上传管理器O数字作为Java applet(或在Flash )或使用一些ActiveX或自定义浏览器特定的API

+0

感谢您的支持,但如果严格解释这一点,这是不真实的,因为浏览器现在已经暴露了JavaScript API这几年了 - 使用插件并不是唯一的方法 – 2012-04-15 18:19:35

+0

根据http://caniuse.com/#feat = fileapi它只有53.99%的支持。 – Luxspes 2012-04-28 04:26:50

相关问题