from django_resized import ResizedImageField
class UserProfilePhoto(Model):
photo = ResizedImageField(size=[128, 128], upload_to=MEDIA_ROOT)
photo_hash = BigIntegerField(
blank=True,
null=True,
help_text=_("an integer representation of the hexdigest hash of the photo"),
)
def __str__(self):
return f"{self.photo.name} ({self.photo_hash})"
我曾经在模型中有一个 save() 操作,它可以调整大小,但现在我使用 Django-resized,因为在弄清楚如何调整照片大小并生成哈希值之后,结果发现有一个模块已经做到了。
我正在向管理员中的用户个人资料照片添加图片。
SuspiciousFileOperation at /admin/userprofile/userprofilephoto/add/
Detected path traversal attempt in '/app/mine/media/mendlebrot-lawn.jpeg'
如何关闭错误或验证?
提前回答一些问题:
不。我不会回到 ImageField() 它给了我同样的问题,但有更多的代码。
upload_to
参数旨在指定一个子目录或可调用的子目录,以确定上传的文件应相对于MEDIA_ROOT
存储在哪里,而不是像您当前使用的绝对路径。
问题是
MEDIA_ROOT
是指向媒体文件根目录的绝对路径,但 upload_to
旨在处理 MEDIA_ROOT
内的子路径。在 upload_to
中使用绝对路径可能会被解释为路径遍历尝试。
您应该上传
upload_to
来指定 MEDIA_ROOT
内的相对目录,而不是直接使用绝对 MEDIA_ROOT
。
class UserProfilePhoto(Model):
....
photo = ResizedImageField(size=[128, 128],
upload_to="user_photos/")
....
这里
upload_to="user_photos/"
告诉 Django 将上传的图像存储在 user_photos
目录下名为 MEDIA_ROOT
的子目录中。