Django序列化器上传图片未存储到服务器存储问题咨询
说法正误判断
你提到的说法是错误的。Django REST Framework的ModelSerializer在配合模型层的ImageField使用时,只要正确完成视图层的请求处理、调用序列化器的save()方法,不需要手动写文件写入逻辑,框架会自动完成「图片格式校验→文件写入指定存储目录→模型对应字段更新为文件路径」的全流程。
逻辑说明
你的Product模型里image字段设置了upload_to='media'参数,这个参数已经明确指定了文件的存储路径:
- 序列化器在校验完上传文件属于合法图片类型后,只要调用
save()方法,会自动把文件写入你Django配置中MEDIA_ROOT对应的目录下的media子目录 - 同时会自动把文件的访问路径存到Product实例的
image字段中,全程不需要额外操作。
你提供的手动存储函数的问题
你写的handle_uploaded_file函数完全不需要使用,且直接使用还存在风险:
- 直接拼接路径
media/{f}存在路径遍历漏洞,可能被恶意用户利用写入文件到任意目录 - 没有处理重名文件的覆盖问题,Django原生存储逻辑会自动给重名文件添加随机后缀避免覆盖,手写逻辑很难覆盖这类边界情况
- 属于重复造轮子,Django已经把文件存储的各类通用逻辑做了封装,直接用即可。
正确使用要求
你只需要满足以下几个条件就能正常实现图片上传,不需要额外写存储逻辑:
- Django配置文件中正确设置了
MEDIA_ROOT和MEDIA_URL参数 - 视图层接收的是
multipart/form-data类型的请求,DRF可以正确解析出上传的文件 - 实例化序列化器时把包含文件的请求数据传入,校验通过后调用
serializer.save()即可。
内容的提问来源于stack exchange,提问作者Boma Anjang
相关产品推荐
相关产品推荐

