2014-06-14 5 views
0

사용자로부터 이미지를 가져 와서 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 

는, 태그는 {{이미지}} 파일의 이름을 반환합니다.

+0

당신이 그것을 보여주고 싶은 경우에 나는 그것이 가능하다고 생각하지 않습니다 사용자에게 어딘가에 있어야합니다. 임시로 파일을 저장하여 imagehosting API를 통해 저장하고 서버의 현재 이미지를 삭제할 수 있습니다. img src = "{{image.url}}" – Tony

+0

템플릿의 이미지를 렌더링하려면 django 캐시를 사용하십시오. – Harkonnen

답변

2

문제는 사용자에게 페이지를 반환하는 것은 일반적으로 두 개의 요청을 포함하는 것입니다. 그러나 당신이 말했듯이, 그동안 어디에도 저장하지 않으면 이미지가 손실됩니다.

대체 방법이 있습니다. 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 }}"> 
+0

좋은 해결책! 하지만 "InMemoryUploadedFile이 아닌 버퍼로 변환 가능"오류가 발생했습니다. 제발 도와 주시겠습니까?) – Harkonnen

+0

'file.read()'를 호출하여 실제 데이터를 가져올 수 있습니다. –

3

양식이 모델 양식 인 경우 다음 코드를 시도하십시오. 이미지 자체에 대한 HTML 페이지 하나 하나를 그 HTML의 img 태그에 의해 참조로 :

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") 
관련 문제