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
相关产品推荐
相关产品推荐

