网站图片上传:如何区分含多个.的文件名中的真实扩展名?
解决文件名含多个点时的扩展名提取问题
你的问题出在使用split('.')拆分文件名,这个方法会把所有点都拆分,导致无法正确识别最后一个点对应的扩展名。Python的os.path模块提供了splitext()方法,专门用来处理文件名和扩展名的拆分,不管文件名里有多少个点,它都会把最后一个点后面的内容作为扩展名。
修改后的函数代码如下:
import os def upload_files(files, extensions, path, overwrite=False, rename=None): if not os.path.exists(path): os.makedirs(path) filepath = None for file in files: # 使用os.path.splitext拆分文件名和扩展名 name_without_ext, ext = os.path.splitext(file.filename) # 去掉扩展名开头的点,匹配原有extensions的格式 ext = ext.lstrip('.') if ext in extensions or extensions == '*': if rename: filepath = os.path.join(path, f"{rename}.{ext}") else: filepath = os.path.join(path, file.filename) file.save(filepath, overwrite=overwrite) else: raise Exception('[ FILE ISSUE ] - File Extension is not allowed.')
关键修改说明:
- 替换
split('.')为os.path.splitext():这个方法返回元组(不含扩展名的文件名, 带点的扩展名),比如处理image.v2.jpg时会得到("image.v2", ".jpg"),完美区分真实扩展名。 - 用
ext.lstrip('.')移除扩展名前的点:保证和你原有extensions列表的格式一致(比如列表存的是"jpg"而非".jpg")。 - 改用
os.path.join()拼接路径:避免手动拼接路径时出现的分隔符兼容问题,让代码适配不同操作系统。
额外注意:
- 若遇到无扩展名的文件(如
README),splitext会返回("README", ""),此时ext为空字符串,可根据需求添加逻辑处理(比如默认允许或抛出异常)。 - 建议对文件名做安全校验,过滤
../这类路径遍历字符,避免恶意文件上传风险。
内容的提问来源于stack exchange,提问作者tygzy
相关产品推荐
相关产品推荐

