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

Django REST中Base64编码后无法保存文件至模型的问题

问题解决:ValueError: I/O operation on closed file

问题原因

你在create方法里用with img.open('rb') as f读取文件,with块执行完毕后会自动关闭文件流。但Django保存ImageField字段时,需要再次读取文件内容完成上传操作,此时文件已经被关闭,就触发了这个错误。

解决方案

读取文件内容后,重置文件指针到开头,让Django后续保存时能正常读取文件。修改serializers.py中的create方法:

class HelpDeskDemandSerializer(serializers.ModelSerializer):

    class Meta:
        model = HelpDeskDemandModel
        fields = [
            'code', 'image1', 'image2'
        ]


    def create(self, validated_data):
        base64_files = []
        for i in range(1, 3):
            img = validated_data.get(f"image{i}", None)

            if img:
                # 直接打开文件并读取,避免with语句自动关闭文件
                img.open('rb')
                base64_content = base64.b64encode(img.read()).decode()
                # 重置文件指针到开头,确保后续保存能读取文件
                img.seek(0)
                base64_files.append(base64_content)


        instance = HelpDeskDemandModel.objects.create(**validated_data)

        return instance

补充说明

这种方式既完成了Base64编码的需求,又保证了Django能正常读取文件完成上传。后续你可以直接使用base64_files列表里的编码内容调用远程API,不会影响模型数据的保存。

内容的提问来源于stack exchange,提问作者erhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:58:38