0

我最近一直在问这个问题。

我创建了我的上传表单

模型.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

表格.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

我被告知要使用这个片段,我找到了这个片段

但是有一个我没有看到的问题,一个 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.

看到这个问题。这个问题是关于asp.net的,我用的是django,那么在你上传视频之前如何在django中检测视频的文件大小

4

2 回答 2

2

你需要在它到达 Django 之前切断 HTTP 上传,你通常在你的前端 Web 服务器上执行此操作,它可能是 Apache、Nginx 或任何东西,所以这个问题不是 Django 特定的。

然而最终的解决方案是使用 HTML5 Javascript File API 在客户端读取文件大小并防止用户在<form>选择太大文件时点击提交按钮:

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

因为旧的浏览器不支持这两种方法,你仍然需要回退 webserver cut 并假设不是在每个浏览器上都执行 Javascript 验证。

于 2012-04-15T14:13:13.347 回答
-1

在上传之前检测视频文件大小的唯一方法是使用客户端编程,您必须在 Silverlight 中编写上传管理器,或者作为 Java Applet(或 Flash),或者使用一些 ActiveX o 自定义浏览器特定 API

于 2012-04-15T14:16:33.250 回答