我的页面中有上传图片的输入。 当您点击“发送图片”时,我的后端会收到帖子请求。
我没有,我不想,保存图片。
我从后面做的是:我将图像发送到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,它将起作用。我仍然没有得到它,也没有让它成功。
答案 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)