views:

106

answers:

2

I have a simple form that submits a image to the blobstore and a title for the image. This works on my local devserver but when I deploy my code, non ascii letters in the title become garbled with some kind of mixture of ascii and hex. For example Ísland becomes =CDsland. Note, I am using <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> as the first value In the header. Also utf-8 works for all my other forms. Just the multipart form that becomes garbled. Anyways this is my form:

<form action="{{ uploadurl }}" enctype="multipart/form-data" method="post">
  <div><label>Title</label><input type="text" name="title" class="string" /></div>
  <div><label>Picture</label><input type="file" name="img"/></div>
  <div style="margin-top:10px;"><input type="submit" value="Add picture" /></div>
  <input type="hidden" value="{{ album.key }}" name="alid"/>
</form>

And this is the class handling the form:

# handler for posting photos
class PostPhoto(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        upload_files =  self.get_uploads('img')
        photourl = images.get_serving_url(str(upload_files[0].key()))
        photo = Photo()
        #because of multipart/form-data
        photo.title = self.request.get("title")
        photo.photourl = photourl
        photo.photoalbum = PhotoAlbum.get(self.request.get('alid'))     
        photo.put()

Does anyone have a clue how I can fix this? Do I have to do some server side encoding/decoding? I have tried googling around for that with no results(python newb), so this is my last resort before i just alter my design and split up the forms.

+1  A: 

have you tried photourl = images.get_serving_url(unicode

(upload_files[0].key())) insted of photourl = images.get_serving_url(str(upload_files[0].key()))

boblefrag
The problem is not with the url. The url is just made from the key-value I get from the blobstore. It is with the title. photo.title = self.request.get("title") I have tried using unicode(self.request.get("title")) and it threw an exception.
Símon Óttar Vésteinsson
It would be great if you tell us what exception is thrown ! As we can help you decode to the good encoding.
boblefrag
+2  A: 

=CD is the quoted-printable representation of Í.

I have no explanation as to why the production server would be giving you this data as quoted-printable when the dev_appserver doesn't, but the quopri module from the standard library can decode it for you.

Wooble
When I do print quopri.encodestring("Í") I get =C3=8D and when I do print quopri.decodestring("=CD") I just get a � But this Is actually the closes I have gotten to making this right :)
Símon Óttar Vésteinsson
You might need to further encode the result to utf-8 (or whatever encoding you're using) before printing it.
Wooble