我想从用户那里获取图像,在beckend处理它并将结果呈现给用户。是否可以不在磁盘上保存图像?
我的观点:
class InputImageForm(forms.Form):
image = forms.ImageField()
def get_image(request):
if request.method == 'POST':
form = InputImageForm(request.POST, request.FILES)
if form.is_valid():
image = request.FILES['image']
#some actions with image
return render_to_response('results.html', {'image': image})
else:
form = InputImageForm()
else:
raise Http404
在模板中,标记{{image}}返回文件名。
答案 0 :(得分:3)
如果您的表单是模型表单,那么请尝试以下代码。
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
class InputImageForm(forms.Form):
image = forms.ImageField()
class Meta:
model = YourModel
def get_image(request):
if request.method == 'POST':
form = InputImageForm(request.POST, request.FILES)
if form.is_valid():
image = request.FILES['image']
save_image_from_url(form,image)
else:
form = InputImageForm()
else:
raise Http404
def save_image_from_url(model, img):
r = request.FILES['image']
img_temp = NamedTemporaryFile(delete=True)
img_temp.write(r.content)
img_temp.flush()
i = model.image.save("image.jpg", File(img_temp), save=True)
return HttpResponse(i.read(), mimetype="YOUR MIME TYPE")
答案 1 :(得分:2)
问题是将页面返回给用户通常会涉及两个请求:一个用于HTML页面,另一个用于图像本身,由该HTML中的img标记引用。但正如你所说,在此期间不将其存储在任何地方,图像就会丢失。
还有另一种方法:您可以使用data uri在html中包含内嵌图像的实际数据。这意味着您不必在请求中保留它,因为所有内容都将在一个请求中返回。大多数浏览器都支持数据uris,包括ie8 +。
您可以像这样格式化数据,例如:
from base64 import b64encode
encoded = b64encode(img_data)
mime = "image/jpeg"
uri = "data:%s;base64,%s" % (mime, encoded)
直接在模板中使用它:
<img src="{{ uri }}">
答案 2 :(得分:1)
这个答案的灵感来自@Daniel Roseman 的答案
将图像写入 BytesIO()
from PIL import Image
img = Image.open("image.jpg")
data = io.BytesIO()
img.save(data, "JPEG") # just an example, load the image into BytesIO any way you like.
将 img
编码为 base64
encoded_img = base64.b64encode(data.getvalue())
在上下文中解码 img
,以及设置 content_type
decoded_img = encoded_img.decode('utf-8')
img_data = f"data:image/jpeg;base64,{decoded_img}"
渲染你的模板
return render(request, "index.html", img_data=img_data)
在您的 HTML 模板中
<img src="{{ img_data }}" >