我的网站依靠用户上传的图像文件。我想限制max_upload_size。Django图片上传中...阻止巨大文件上传
我知道你可以在settings.py中设置FILE_UPLOAD_MAX_MEMORY_SIZE。如果上传大于此大小的文件,则会将其写入tmp目录中的磁盘。这几乎处理的事情?巨大的图像仍会影响我网站的表现吗?
我见过的另一种方法是在apache中配置max_upload_size,这似乎包含在php.ini中。这听起来是对的吗?这是可取的吗?
另一个步骤涉及检查文件对象的属性。我已经浏览了这个snipet(http://djangosnippets.org/snippets/1303/),它提供了一种表单验证方法。
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,即使它引发验证错误?
最后,您还会注意到,此表单验证尝试过滤内容类型。我认为这几乎毫无价值,因为它只是看扩展,这很容易被欺骗。这也是公平的吗?
我知道这个问题有点散漫,但它(至少对我来说)是一个艰难和扩散主题
嘿shadfc,这是一个伟大的答案。我找不到LimitRequestBody。我的想法是,我将使用表单验证达到一定的大小,然后为奇怪的大文件实施LRB。 – Ben 2011-04-24 12:53:31
@ brendan:这可能是最好的。我对QuotaUploadHandler做了一个快速测试,似乎没有办法处理由此引发的错误 - 您只会收到连接重置错误。所以让apache处理巨大的可能是最好的,因为他们会得到更具体的错误信息。这太糟糕了,你必须将这个功能用于网络服务器。在Django中处理这个表单错误会很棒,但这可能是一个梦想。 – shadfc 2011-04-25 19:26:02
QuotaUploadHandler的链接已死亡 – 2016-06-21 07:57:19