我的网站依赖于用户上传的图像文件。我想限制max_upload_size。
我知道您可以在settings.py中设置FILE_UPLOAD_MAX_MEMORY_SIZE。如果上传的文件大于此大小,则会将其写入tmp目录中的磁盘。这能很好地处理事情吗?巨大的图片还会影响我网站的性能吗?
我看到的一种替代方案是在apache中配置max_upload_size,它(看起来)包含在php.ini中。这听起来对吗?这是可取的吗?
另一个步骤涉及检查File对象的属性。我看过这段代码(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,即使它引发了验证错误?
最后,您还会注意到此表单验证尝试过滤内容类型。我认为这是没有价值的,因为它只是看扩展,这很容易被欺骗。这也公平吗?
我知道这个问题有点杂乱无章,但它是一个棘手且广泛的主题(至少对我而言)
发布于 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在超过一定大小后停止上传,您最终可能会向超过该限制的用户显示一些相当丑陋的错误页面。
发布于 2015-04-10 13:34:12
尝试下面的代码,
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')https://stackoverflow.com/questions/5767840
复制相似问题