Django REST Framework:如何将InMemoryUploadedFile保存至磁盘?
解决Django中InMemoryUploadedFile保存到磁盘的问题
你的错误原因是InMemoryUploadedFile对象没有你调用的那种带参数的save方法,要把上传的文件保存到磁盘,需要用Python标准的文件操作来实现,以下是修改后的代码:
import os import uuid from shutil import copyfileobj from django.conf import settings class UserAvatarUpdateSerializer(ClearNullSerializer, serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault()) avatar = serializers.ImageField(write_only=True, required=True) class Meta: model = get_user_model() fields = ('id', 'user', 'avatar',) read_only_fields = ('id', 'user') def save(self, **kwargs): new_avatar = self.validated_data['avatar'] # 用os.path.join规范拼接路径,避免手动拼接出现分隔符问题 directory = os.path.join(settings.MEDIA_ROOT, "tmp") # 确保目标目录存在,不存在则自动创建 os.makedirs(directory, exist_ok=True) # 生成唯一文件名并拼接完整路径 filename = f"{uuid.uuid4()}.png" file_path = os.path.join(directory, filename) # 方式1:用shutil.copyfileobj高效复制文件内容(推荐,处理大文件更稳定) with open(file_path, 'wb') as dest_file: copyfileobj(new_avatar, dest_file) # 方式2:手动分块读取写入(无需额外导入shutil时使用) # with open(file_path, 'wb') as dest_file: # for chunk in new_avatar.chunks(): # dest_file.write(chunk)
关键注意点:
- 避免直接用字符串拼接路径,改用
os.path.join适配不同操作系统的路径规则 - 必须确保保存目录存在,否则会抛出文件不存在的异常
- 分块写入或用
copyfileobj都是为了适配大文件上传场景,避免内存占用过高
内容的提问来源于stack exchange,提问作者user18726875
相关产品推荐
相关产品推荐

