Python 上传图片格式校验:利用 rfind 解决文件名含点号的问题
本文介绍在 Python 图片上传场景中,如何利用字符串的 rfind 方法解决文件名中包含多个点号(如 www.图片1.jpg)导致的格式校验失败问题。通过对比 split 与 rfind 的差异,提供基于后缀截取的安全校验代码示例,确保图片格式判断的准确性。
Python 图片上传格式校验:利用 rfind 解决文件名含点号的问题
经过一段时间的忙碌,终于有空进行技术分享。本次内容聚焦于一个相对基础但常见的问题:在图片上传过程中如何严格限制允许的格式。
首先直接展示核心代码实现。
核心代码实现
img_file = 'D:\\image\\test.jpg'
# uuid生成文件名
key = shortuuid.ShortUUID().random(length=9)
if img_file.size > 2097152:
raise exceptions.APIException('图片大小超出限制')
# file_postfix = img_file.name.split('.')[1]
suffix = img_file.name.rfind('.')
if suffix == -1:
raise exceptions.APIException('图片不正确')
file_postfix = img_file.name[suffix + 1:]
if file_postfix not in ['jpg', 'png', 'gif', 'bmp', 'jpeg', 'JPG', 'PNG',
'BMP', 'JPEG', ]:
raise exceptions.APIException('图片格式不正确')
file_name = key + '.' + file_postfix
传统 split 方法的局限性
在以往的项目开发中,通常采用 file_postfix = img_file.name.split('.')[1] 这种方式,即通过 split 分割文件名并取索引为 1 的后缀来判断格式。对于常规命名的文件,例如图片1.jpg、图片2.jpg 或图片3.jpg,这种方法通常能正常工作。然而,当遇到文件名中包含多个点号的情况,例如 www.图片1.jpg 时,该逻辑就会失效,因为 split 方法默认按所有点号分割,导致取到的后缀并非预期的扩展名。
rfind 方法的优势与原理
此时,suffix = img_file.name.rfind('.') 方法提供了更好的解决方案,因为它支持从字符串末尾向前查找。具体示例如下。
a = '123456'
print('下标', a.rfind('5'))
运行上述代码,输出结果为:下标 4
a = '123456'
print('下标', a.rfind('7'))
若查找不存在的字符,输出结果为:下标 -1
rfind 方法的工作原理是从字符串的最后一个字符开始向前搜索,一旦找到匹配的子串则返回其索引位置;若未找到,则返回 -1。
因此,对于 www.test.jpg 这类文件名,利用 rfind 从末尾定位最后一个点号,截取该点号之后的部分即可得到正确的后缀(如 jpg),从而准确判断格式。
需要特别注意的是,rfind 返回的下标是从 0 开始计数的。因此,在截取后缀字符串时,必须取下标加 1 的位置作为起始点,即 img_file.name[suffix + 1:]。
总结与后续计划
基本逻辑至此已阐述完毕。关于其他细节不再赘述。近期计划更新关于将图片上传至微信服务器的相关技术文章。
总结
以上内容介绍了如何利用 Python 解决图片上传时的格式限制问题,希望能对读者有所帮助。如有任何疑问,欢迎留言交流,作者会及时回复。感谢大家对本网站的支持! 如果本文对您有帮助,欢迎转载,请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









