[Zope] Viewing images from a form upload

Jonathan dev101 at magma.ca
Tue Jul 11 16:18:25 EDT 2006

Pls keep your posts on the list...

----- Original Message ----- 
From: "vl" <admin at vltool.com>
To: "Jonathan" <dev101 at magma.ca>
Sent: Tuesday, July 11, 2006 4:01 PM
Subject: Re: [Zope] Viewing images from a form upload

> Jonathan wrote:
>> ----- Original Message ----- From: "vl" <admin at vltool.com>
>> To: <zope at zope.org>
>> Sent: Tuesday, July 11, 2006 3:07 PM
>> Subject: [Zope] Viewing images from a form upload
>>> I am stuck on trying to preview images that are uploaded from a html 
>>> form.
>>> <form method="POST" action="py_save_new_image" 
>>> enctype="multipart/form-data">
>>> <input type="file"  name="file">
>>> <input type="submit" name="save" value="Upload">
>>> When the form is submited it sends it to a python script that gets the 
>>> image and sends it to another page to be previewed.  Problem is, I 
>>> receive and error that the image cannot be displayed.
>>> My python script is below.
>>>     REQUEST=context.REQUEST
>>>     content_type=file.headers['Content-Type']
>>>     if content_type.find('image')!=-1:
>>>         context.REQUEST.RESPONSE.setHeader('Content-Type', 'image/jpg')
>>>         img = file.read()
>>>         print context.dtml_select_new_image(context, context.REQUEST, 
>>> image=img)
>>>         return printed
>>>     else:
>>>         return "error"
>>> I load the image in a dtml method with:
>>> <dtml-var image>
>> The dtml-var tag creates an html img tag which your browser then uses to 
>> make another HTTP call to the server to acquire the image file. This 
>> means that the image data must be saved on the server (ie. you cannot 
>> return the image data in the initial response).
>> So, your process should be:
>> 1) get the image data from the form
>> 2) save an image object somewhere
>> 3) pass back an html img tag with the path/id of the saved image object
> Is saving the image the only way of viewing it?  I can view the image if I 
> return it in the python script like:
> context.REQUEST.RESPONSE.setHeader('Content-Type', 'image/jpg')
> img = file.read()
> return img
> The image will display.  But I need to view it in a dtml-method.

If you want to use plain vanilla html then you need to use the img tag to 
display the image.  The img tag causes the browser to initiate a new http 
request to the server, therefore the server needs a way to return the image 
(ie. a path/id).

There are two ways (that I know of, but there are probably other ways) 
around this situation:

1) store the image in a temporary folder (a folder that uses RAM not written 
to disk via the zodb); you need to be careful with memory utilization with 
this approach.

2) you may be able to send the data back in a javascript variable and then 
execute javascript on the browser in order to display the image 
(mulit-browser support will be an issue with this option)


More information about the Zope mailing list