2010-09-02 6 views
13

Ho un semplice modulo che invia un'immagine al blobstore e un titolo per l'immagine. Funziona sul mio devserver locale ma quando distribuisco il mio codice, le lettere non ascii nel titolo diventano confuse con una specie di misto di ascii e hex. Ad esempio, Ísland diventa = CDsland. Nota, sto usando <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> come primo valore nell'intestazione. Anche utf-8 funziona per tutte le mie altre forme. Solo il modulo multipart che diventa confuso. In ogni modo questo è il mio modulo:Problema di codifica nel motore di app durante l'invio di moduli 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> 

E questa è la manipolazione del modulo di classe:

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

Qualcuno ha idea di come posso risolvere questo problema? Devo eseguire qualche codifica/decodifica sul lato server? Ho provato a googling per quello senza risultati (python newb), quindi questa è la mia ultima risorsa prima di modificare il mio design e dividere i moduli.

+0

Cosa stai usando per determinare ciò che il titolo si trova sul server? E funziona se pubblichi direttamente su un gestore, senza usare blobstore? –

+0

Che il tag del tipo meta contenuto sia presente nella parte superiore della testina HTML è completamente irrevante ogni volta che la tua pagina web viene pubblicata su HTTP. Un webbrowser un po 'discreto utilizzerà invece quello nell'intestazione della risposta HTTP. Vedi anche w3 spec http://www.w3.org/TR/html4/charset.html#h-5.2.2 – BalusC

+0

Per ora l'appegine SDK 1.7.2 non è ancora stato risolto ma il comportamento della produzione è leggermente cambiato: 'Ísland 'diventa' zXNsYW5k '. unicode (base64.b64decode ('zXNsYW5k'), 'iso_8859-2') – keiw

risposta

1

Hai provato photourl = images.get_serving_url (unicode

(upload_files [0] .key())) invece di photourl = images.get_serving_url (str (upload_files [0] .key()))

+0

Il problema non è con l'url. L'url viene appena creato dal valore-chiave che ottengo dal blobstore. È con il titolo. foto.title = self.request.get ("title") Ho provato ad usare unicode (self.request.get ("title")) e ha lanciato un'eccezione. –

+0

Sarebbe bello se ci dicessi quale eccezione viene lanciata! Come possiamo aiutarti a decodificare la buona codifica. – boblefrag

2

= CD è la rappresentazione stampabile quotata di Í.

Non ho alcuna spiegazione sul motivo per cui il server di produzione fornirebbe questi dati come quotato-stampabile quando non lo fa il server_app, ma il modulo quopri dalla libreria standard può decodificarlo per voi.

+0

Quando stampo quopri.encodestring ("Í") ottengo = C3 = 8D e quando stampo quopri.decodestring ("= CD") ottengo solo un ma questo è effettivamente il punto di chiusura che ho ottenuto per fare questo right :) –

+0

Potrebbe essere necessario codificare ulteriormente il risultato in utf-8 (o qualsiasi altra codifica che si sta utilizzando) prima di stamparlo. – geoffspear

5

sto usando Django nonrel e fissato con questo 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 
Problemi correlati