【发布时间】:2011-08-11 16:33:12
【问题描述】:
我的网站依赖于用户上传的图像文件。我想限制 max_upload_size。
我知道你可以在 settings.py 中设置 FILE_UPLOAD_MAX_MEMORY_SIZE。如果上传的文件大于此大小,则会将其写入 tmp 目录中的磁盘。这几乎可以处理事情吗?巨大的图片仍然会影响我网站的性能吗?
我见过的另一种方法是在 apache 中配置 max_upload_size,它(似乎)包含在 php.ini 中。听起来对吗?可取吗?
另一个步骤涉及检查文件对象的属性。我浏览了这个提供表单验证方法的片段(http://djangosn-ps.org/sn-ps/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,即使它引发了验证错误?
最后,您还会注意到此表单验证尝试过滤内容类型。我认为这几乎毫无价值,因为它只是查看扩展,很容易被欺骗。这也公平吗?
我知道这个问题有点漫无边际,但它是一个棘手且分散的主题(至少对我而言)
【问题讨论】:
标签: django file django-models file-upload