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

网站图片上传:如何区分含多个.的文件名中的真实扩展名?

解决文件名含多个点时的扩展名提取问题

你的问题出在使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:20:38