如何在Python中查找base64编码图像的文件扩展名

时间:2014-01-10 00:42:10

标签: python image base64 mime-types file-extension

我有一个base64编码的图像,我将其解码并保存到Django中的ImageField中。我想给文件一个随机名称,但我不知道文件扩展名。

我在字符串前面加了“data:image / png; base64”,我知道我可以做一些正则表达式来提取mimetype,但我想知道是否有最佳实践方法可以从“ data:image / png; base64,“to”.png“可靠。当有人突然想要上传我不支持的奇怪图像文件类型时,我不想让我的手枪功能中断。

5 个答案:

答案 0 :(得分:4)

最佳做法是检查文件的内容,而不是依赖文件外部的内容。例如,许多电子邮件攻击依赖于错误识别mime类型,以便毫无戒心的计算机执行它不应该的文件。幸运的是,大多数图像文件扩展名可以通过查看前几个字节(在解码base64之后)来确定。但是,最佳做法可能是使用file magic,可以通过this onethis one等python包访问。

大多数图片文件扩展名都是从mimetype中显而易见的。对于gif,pxc,png,tiff和jpeg,文件扩展名就是' image /'之后的任何内容。部分哑剧类型。为了处理晦涩的类型,python确实提供了一个标准包:

>>> from mimetypes import guess_extension
>>> guess_extension('image/x-corelphotopaint')
'.cpt'
>>> guess_extension('image/png')
'.png'

答案 1 :(得分:2)

看起来mimetypes stdlib module即使在Python 2中也支持数据网址:

>>> from mimetypes import guess_extension, guess_type
>>> guess_extension(guess_type("data:image/png;base64,")[0])
'.png'

答案 2 :(得分:1)

您可以使用mimetypes模块 - http://docs.python.org/2/library/mimetypes.html

基本上mimetypes.guess_extension(mine)应该完成这项工作。

答案 3 :(得分:0)

我在Lambda中有书面代码,该代码可以找到图像的类型,还可以检查base64是否为图像。

以下代码肯定会帮助某人。

import base64
import imghdr
def lambda_handler(event, context):
    image_data = event['img64']    # crate "json event" in lambda 
                                   # Sample JSON Event ========>  { "img64" : BASE64 of an Image }
                                   # Get BASE64 Data of image in image_data variable.
    sample = base64.b64decode(image_data)      # Decode the base64 data and assing to sample.

    for tf in imghdr.tests:
        res = tf(sample, None)
        if res:
            break;
    print("Extension OR Type of the Image =====>",res)
    if(res==None): # if res is None then BASE64 is of not an image.
            return {
            'status': 'False',
           'statusCode': 400,
           'message': 'It is not image, Only images allowed'
          }
    else:
        return 'It is image'  

注意:-上面的代码是用python编写的Lambda(AWS),您可以将以下代码复制并粘贴到本地计算机上,并如下进行测试。

import base64
import imghdr
image_data = "BASE64 OF AN IMAGE"
sample = base64.b64decode(image_data)      # Decode the base64 data and     assing to sample.

for tf in imghdr.tests:
    res = tf(sample, None)
    if res:
        break;
print("Extension OR Type of the Image =====>",res)
if(res==None):
    print('It is not image, Only images allowed')
else:
    print('It is image')

答案 4 :(得分:0)

假设将base64编码为变量encoded_string,下面的代码对我有用:

from base64 import b64decode
import imghdr

encoded_string = 'image base64 encoded'

decoded_string = b64decode(var)
extension = imghdr.what(None, h=decoded_string)