我有一个base64编码的图像,我将其解码并保存到Django中的ImageField中。我想给文件一个随机名称,但我不知道文件扩展名。
我在字符串前面加了“data:image / png; base64”,我知道我可以做一些正则表达式来提取mimetype,但我想知道是否有最佳实践方法可以从“ data:image / png; base64,“to”.png“可靠。当有人突然想要上传我不支持的奇怪图像文件类型时,我不想让我的手枪功能中断。
答案 0 :(得分:4)
最佳做法是检查文件的内容,而不是依赖文件外部的内容。例如,许多电子邮件攻击依赖于错误识别mime类型,以便毫无戒心的计算机执行它不应该的文件。幸运的是,大多数图像文件扩展名可以通过查看前几个字节(在解码base64之后)来确定。但是,最佳做法可能是使用file magic,可以通过this one或this 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)