如何获取Django中TemporaryUploadedFile的原始文件名及扩展名?
解决方案
核心问题说明
你之前通过dict((self.context['request'].data).lists()).get('images', None)获取文件列表的方式本身没问题,但错误地取了临时文件的名称而非上传时的原始文件名。Django的UploadedFile对象本身就存储了原始文件名(含扩展名),和TemporaryFileUploadHandler的配置无关。
实现步骤
- 正确获取文件列表:直接从
request.data中用getlist获取文件数组,无需转成字典。 - 提取原始文件名:每个文件对象的
.name属性就是客户端上传时的原始文件名(带扩展名)。 - 拆分文件名与扩展名:用Python标准库
os.path.splitext拆分文件名和扩展名。
代码示例
import os from rest_framework.response import Response from rest_framework.views import APIView class ImageUploadView(APIView): def post(self, request): # 直接获取上传的文件列表,默认返回空列表 images = request.data.getlist('images', []) for image in images: # 获取原始文件名(包含扩展名) original_filename = image.name # 拆分文件名和扩展名 file_name, file_ext = os.path.splitext(original_filename) # 示例:按原始文件名保存文件(可自定义保存路径) # 若需处理重名,可在文件名后添加时间戳等标识 image.save(original_filename, image) # 调试输出(可选) print(f"原始文件名:{original_filename}") print(f"文件名:{file_name},扩展名:{file_ext}") return Response({"message": "文件上传处理完成"})
关键注意点
UploadedFile.name属性不受上传处理器影响,无论用TemporaryFileUploadHandler还是MemoryFileUploadHandler,都能稳定拿到原始文件名。- 如果需要避免文件名重名覆盖,可以在保存前对文件名添加后缀(比如时间戳、随机字符串)。
内容的提问来源于stack exchange,提问作者Smith
相关产品推荐
相关产品推荐

