在html上传后,Python会在base 64中编码图像

时间:2016-08-26 14:09:54

标签: python django base64

我的页面中有上传图片的输入。 当您点击“发送图片”时,我的后端会收到帖子请求。

我没有,我不想,保存图片。

我从后面做的是:我将图像发送到API,它将返回图像的标签,然后我将在我的html页面中显示已上传的标签和图像。< / p>

if request.method == "POST":
            form = ImageForm(request.POST, request.FILES)

            if form.is_valid():
                imageUploaded = request.FILES['image_file']
                try:
                    c = Client(cId, sId)
                    c.get_token()
                    tags = c.image_lookup(imageUploaded)

                    urlImage = base64.b64encode(imageUploaded.read())
                    context.update({
                        'image_path': urlImage,
                        'tags': tags.json,
                        'btn_visible': True,
                    })
                except ValueError as e:
                    logging.info(e)
                    context.update({
                        'btn_visible': False,
                        'error_message': 'A problem occured, we will fix it as soon as possible. We apologise for the inconvenience.'
                    })

在我的HTML中:

<img id="cv-image" src="data:image/png;base64,{{ image_path }}">

但是,我的问题是我的image_path绝对是空的。

有什么问题?

编辑: 这是非常奇怪的,如果我评论调用Client类的代码,它在API上执行GET和POST,它将起作用。我仍然没有得到它,也没有让它成功。

2 个答案:

答案 0 :(得分:1)

我在这里参加聚会可能已经太晚了,但我偶然发现了这一点,这听起来像是文件搜索位置的问题。如果image_lookup()读取文件(或导致文件被读取),它可能会将搜索位置留在文件的末尾。因此,后续读取文件(从该位置)不返回任何内容。

这是有道理的,因为注释image_lookup()调用,并在进行调用之前制作文件实例的副本,两者都有效。如果确实如此,那么您需要做的就是找回文件,这很简单:file.seek(0)

这是未经测试的,但应该是你所需要的:

c = Client(cId, sId)
c.get_token()
tags = c.image_lookup(imageUploaded)

# Seek file back to the beginning
imageUploaded.seek(0)

urlImage = base64.b64encode(imageUploaded.read())

答案 1 :(得分:0)

好的,因为我没有保存图像,所以一旦我将它发送到API,对象本身就不再可用了。

不确定为什么我仍然可以打印它,我不得不复制它:

if form.is_valid():
            imageUploaded = request.FILES['image_file']
            imageCopy = copy.deepcopy(imageUploaded)
            try:
                c = Client(cId, sId)
                c.get_token()
                tags = c.image_lookup(imageUploaded)

                urlImage = base64.b64encode(imageCopy.read())

现在它完美无缺!

如所询问的,这是Image_lookup的代码:

def image_lookup(self, imageUploaded, image_type=None):
        '''POST /v1/imageLookup'''
        param_files = [
            ('input_image', ('image.jpg', imageUploaded, image_type or 'image/png'))
        ]

        return self.post('someAPIurl/imageLookup', files=param_files)