使用 python 在服务器上存储 blob 图像

Store blob image on server with python

我的页面上有 img 个标签 blob src

<img src="blob:http%3A//mydoma.in/43b92f51-3f04-4027-b6a4-01c5bcc68b2d" />

它们是通过使用 TinyMCE 4 选项粘贴 (Ctrl+V) 创建的 paste_data_images: true。 我想将这些图像上传到我的 Python Django 服务器(将它们存储为静态和一些处理,例如应用水印)。但问题是我不知道如何获取 blob 对象,如果我只有 url blob:http%3A//mydoma.in/43b92f51-3f04-4027-b6a4-01c5bcc68b2d

好像我不需要这个因为"blob://" POST到服务器时自动替换为base64数据,所以我只需要在服务器上解析base64并将解码后的字节写入磁盘,并替换img中的src上传文件的标签 url.

我使用 python3 Django,这是我的代码,也许对某些人有用:

# post.content here is uploaded content of text field
post.content = re.sub(
    r'<img (class=".*?" )?src="data:image/(?P<fmt>.+?);base64,(?P<dat>(?:[A-Za-z0-9+/]{4}){2,}(?:[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=|[A-Za-z0-9+/][AQgw]==))".*?>',
    lambda x: proc_blob(post, x), post.content)

def proc_blob(post, mo):
    data = mo.group('dat')
    fmt = mo.group('fmt')
    fname = "{}_{}.{}".format(post.id, str(time.time()).replace('.', '_'), fmt)
    full_name = os.path.join(IMAGES_ROOT, fname)
    fh = open(full_name, "wb")
    fh.write(base64.b64decode(data))
    fh.close()

    # you can apply a watermark here        

    # Optionally in addition we can store image filename in database (for example to remeber what images are related to post)
    im = app.models.Image(post=post, filename=fname)
    im.save()

    return '<img src="/images/{}" class="img-responsive" />'.format(fname)