首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django图片Upload...Prevent大文件上传

Django图片Upload...Prevent大文件上传
EN

Stack Overflow用户
提问于 2011-04-24 08:19:02
回答 2查看 2.5K关注 0票数 1

我的网站依赖于用户上传的图像文件。我想限制max_upload_size。

我知道您可以在settings.py中设置FILE_UPLOAD_MAX_MEMORY_SIZE。如果上传的文件大于此大小,则会将其写入tmp目录中的磁盘。这能很好地处理事情吗?巨大的图片还会影响我网站的性能吗?

我看到的一种替代方案是在apache中配置max_upload_size,它(看起来)包含在php.ini中。这听起来对吗?这是可取的吗?

另一个步骤涉及检查File对象的属性。我看过这段代码(http://djangosnippets.org/snippets/1303/),它提供了一种表单验证方法。

代码语言:javascript
运行
复制
def clean_content(self):
   content = self.cleaned_data['content']
   content_type = content.content_type.split('/')[0]
    if content_type in settings.CONTENT_TYPES:
       if content._size > settings.MAX_UPLOAD_SIZE:
          raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.MAX_UPLOAD_SIZE), filesizeformat(content._size)))
    else:
        raise forms.ValidationError(_('File type is not supported'))
    return content

这里的潜在问题是

1)此代码适用于FileField,而不是ImageField。我知道ImageField是FileField的子类,所以我认为这不是问题。这是真的吗?

2)在验证之前读取整个HttpRequest请求(因此巨大的文件仍然是一个问题)。另外,文件是否仍然写入tmp,即使它引发了验证错误?

最后,您还会注意到此表单验证尝试过滤内容类型。我认为这是没有价值的,因为它只是看扩展,这很容易被欺骗。这也公平吗?

我知道这个问题有点杂乱无章,但它是一个棘手且广泛的主题(至少对我而言)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-24 11:58:42

我知道你可以在settings.py中设置FILE_UPLOAD_MAX_MEMORY_SIZE。如果上传的文件大于此大小,则会将其写入tmp目录中的磁盘。这能很好地处理事情吗?巨大的图片还会影响我网站的性能吗?

这取决于你所说的“处理”是什么意思。它将防止处理上传的过程将整个文件读取到内存中,并耗尽您的服务器资源。它仍然会成功上传,并且你仍然会保存一个“大”文件。我认为这可能会影响站点的性能,因为您将使服务器进程与上传捆绑在一起,而上传将需要更长的时间才能完成,因为它将命中磁盘,这是相对缓慢的。

我见过的一种替代方案是在

中配置max_upload_size,它(看起来)包含在php.ini中。这听起来对吗?这是可取的吗?

在apache中有一种方法可以限制请求的大小,但不是通过该设置。php.ini中的任何东西都是特定于PHP的,与Django无关。您正在寻找apache的LimitRequestBody指令。

这里的问题是关于你想要完成什么。您是否只想限制站点存储的文件的大小,而不关心它们是否真正上载(您不关心带宽使用情况)?如果是这样,那么您可以执行表单验证路线,以便向用户显示更好的错误。

然而,如果你确实关心大量上传占用的带宽,并且你想要停止上传任何大小为N MB的文件,那么你应该考虑使用类似这个QuotaUploadHandler的东西,或者通过你的see服务器设置一个限制(参见上面的LimitRequestBody )。如果使用上载处理程序,则需要在引发StopUpload异常时测试该行为--在File Uploads文档的"receive_data_chunk“方法中有一条关于该异常的小注释。如果您选择让apache在超过一定大小后停止上传,您最终可能会向超过该限制的用户显示一些相当丑陋的错误页面。

票数 4
EN

Stack Overflow用户

发布于 2015-04-10 13:34:12

尝试下面的代码,

代码语言:javascript
运行
复制
from django.core.exceptions import ValidationError
def validate_image(fieldfile_obj):
        filesize = fieldfile_obj.file.size
        megabyte_limit = 2.0
        if filesize > megabyte_limit*1024*1024:
            raise ValidationError("Max file size is %sMB" % str(megabyte_limit))

class User(models.Model):
    avatar = models.ImageField("Avatar", upload_to=upload_logo_to,validators=[validate_image], blank=True, null=True,help_text='Maximum file size allowed is 2Mb')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5767840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档