提交multipart / form-data表单时在app引擎中编码问题

时间:2010-09-02 06:11:28

标签: python google-app-engine character-encoding

我有一个简单的表单,它将图像提交给blobstore,并提供图像的标题。 这适用于我的本地devserver但是当我部署我的代码时,标题中的非ascii字母会变成乱码,并带有ascii和hex的某种混合。例如,Ísland成为= CDsland。注意,我在标题中使用<meta http-equiv="Content-Type" content="text/html; charset=utf-8">作为第一个值。此外,utf-8适用于我的所有其他形式。只是多部分形式变得乱码。无论如何这是我的形式:

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

这是处理表格的类:

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

有没有人知道如何解决这个问题?我是否必须进行一些服务器端编码/解码?我试过谷歌搜索没有结果(python newb),所以这是我最后的手段,我只是改变我的设计并拆分表格。

6 个答案:

答案 0 :(得分:5)

这是一个已知的错误。 http://code.google.com/p/googleappengine/issues/detail?id=3761

回到原始数据是一个问题:

>>> import quopri
>>> t = unicode(quopri.decodestring('=CD'), 'iso_8859-2')
>>> print t
Í

答案 1 :(得分:5)

我正在使用Django nonrel并使用此中间件修复它:

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

答案 2 :(得分:2)

= CD是Í。

的引用可打印表示

我没有解释为什么当dev_appserver没有时,生产服务器会将这些数据作为quoted-printable给你,但标准库中的quopri模块可以为你解码它。

答案 3 :(得分:2)

此评论解释了如何解决问题,并包含appengine_config.py,这使一切正常:http://code.google.com/p/googleappengine/issues/detail?id=2749#c21

我不在这里包含代码,因为我不知道如何附加文件,并且包含内联的内容非常大。

答案 4 :(得分:1)

你试过photourl = images.get_serving_url(unicode

(upload_files [0]的.key())) 设置了photourl = images.get_serving_url(str(upload_files [0] .key()))

答案 5 :(得分:1)

将较新的网络库添加到您的app.yaml:

libraries:
- name: webapp2
  version: "2.5.2"
- name: webob
  version: "1.2.3"

来自:https://code.google.com/p/googleappengine/issues/detail?id=2749