2010-09-02 6 views
13

Tengo un formulario simple que envía una imagen a la tienda de blob y un título para la imagen. Esto funciona en mi devserver local, pero cuando despliego mi código, las letras que no son ascii en el título se confunden con algún tipo de mezcla de ascii y hexadecimal. Por ejemplo Ísland se convierte = CDsland. Tenga en cuenta que estoy usando <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> como el primer valor en el encabezado. También utf-8 funciona para todas mis otras formas. Solo la forma multiparte que se confunde. De todas formas este es mi forma:Problema de codificación en el motor de la aplicación al enviar formularios multipart/form-data

<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> 

Y esta es la clase de manejo de la forma:

# 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() 

¿Alguien tiene una idea de cómo puedo solucionar este problema? ¿Tengo que hacer algo de codificación/decodificación del lado del servidor? He intentado buscar en Google sin obtener resultados (python newb), así que este es mi último recurso antes de modificar mi diseño y dividir los formularios.

+0

¿Qué estás usando para determinar lo que el título está en el servidor? ¿Y esto funciona si publicas directamente en un controlador, sin usar blobstore? –

+0

El hecho de que la etiqueta del tipo de meta contenido esté presente en la parte superior del encabezado HTML es completamente irrelevante siempre que su página web se publique a través de HTTP. Un webbrowser decente usará el que está en el encabezado de respuesta HTTP. Ver también especificación w3 http://www.w3.org/TR/html4/charset.html#h-5.2.2 – BalusC

+0

Por ahora, parece que el SDK 1.7.2 aún no está arreglado, pero el comportamiento de producción cambió ligeramente: 'Ísland 'se convierte en' zXNsYW5k '. unicode (base64.b64decode ('zXNsYW5k'), 'iso_8859-2') – keiw

Respuesta

1

has necesitado photourl = images.get_serving_url (Unicode

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

+0

El problema no está en la url. La URL solo está hecha de la clave-valor que obtengo de la tienda de blob. Es con el título. foto.title = self.request.get ("title") He intentado usar unicode (self.request.get ("title")) y arrojó una excepción. –

+0

Sería genial si nos diga qué excepción se produce. Como podemos ayudarte a descodificar a la buena codificación. – boblefrag

2

= CD es la representación imprimible entre comillas de Í.

No tengo ninguna explicación de por qué el servidor de producción le daría esta información como imprimible entre comillas cuando el dev_appserver no, pero el módulo quopri de la biblioteca estándar puede descodificarlo por usted.

+0

Cuando imprimo quopri.encodestring ("Í") obtengo = C3 = 8D y cuando imprimo quopri.decodestring ("= CD") obtengo un Pero este es el cierre que he tenido para hacer esto derecha :) –

+0

Es posible que necesite codificar aún más el resultado a utf-8 (o la codificación que esté utilizando) antes de imprimirlo. – geoffspear

5

estoy usando Django nonrel y fija con este middleware:

http://code.google.com/p/googleappengine/issues/detail?id=2749#c33

import logging 
import quopri 
log = logging.getLogger(__name__) 

class BlobRedirectFixMiddleware(object): 
    def process_request(self, request): 
     if request.method == 'POST' and 'HTTP_X_APPENGINE_BLOBUPLOAD' in request.META and request.META['HTTP_X_APPENGINE_BLOBUPLOAD'] == 'true': 
      request.POST = request.POST.copy() 
      log.info('POST before decoding: %s' % request.POST) 
      for key in request.POST: 
       if key.startswith('_') or key == u'csrfmiddlewaretoken': 
        continue 
       value = request.POST[key] 
       if isinstance(value,(str, unicode)): 
        request.POST[key] = unicode(quopri.decodestring(value), 'iso_8859-2') 
      log.info('POST after decoding: %s' % request.POST) 
     return None 
Cuestiones relacionadas