0

私は最近、このテーマについて多くの質問をしています。

アップロードフォームを作成しました

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

このスニペットを使用するように言われましたが、このスニペットを見つけました

しかし、私が見なかった問題があります、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 アップロードを遮断する必要があります。これは通常、Apache、Nginx などのフロントエンド Web サーバーで行うため、この質問は Django 固有のものではありません。

ただし、最終的な解決策は、HTML5 Javascript File API を使用してクライアント エンドでファイル サイズを読み取り、ユーザー<form>が大きすぎるファイルを選択した場合に送信ボタンを押さないようにすることです。

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

古いブラウザーは両方の方法をサポートしていないため、Web サーバー カットをフォール バックし、Javascript 検証がすべてのブラウザーで実行されるわけではないことを想定する必要があります。

于 2012-04-15T14:13:13.347 に答える
-1

アップロードする前にビデオのファイルサイズを検出する唯一の方法はクライアント側のプログラミングを使用することです。アップロードマネージャーをSilverlight oでJavaアプレット(またはFlash)として作成するか、ActiveXoカスタムブラウザー固有のAPIを使用する必要があります。

于 2012-04-15T14:16:33.250 に答える