You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:16:14