Django 上传的图片在Firefox、iphone Safari、google chrome中显示不正确,但在internet Explorer中有效

Django 上传的图片在Firefox、iphone Safari、google chrome中显示不正确,但在internet Explorer中有效,django,google-app-engine,jinja2,blobstore,Django,Google App Engine,Jinja2,Blobstore,我下面上传和显示一个图像。 我的测试地点是 除了当我点击图像名称时,Firefox、iphone safari、google chrome浏览器只会写出奇怪的字符,比如 ����JFIF��XExifMM*�i&�� ����C ��C��� "�� ���}!1AQa"q2���#B��R��$3br� %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���������������������������������������

我下面上传和显示一个图像。 我的测试地点是 除了当我点击图像名称时,Firefox、iphone safari、google chrome浏览器只会写出奇怪的字符,比如

����JFIF��XExifMM*�i&�� ����C     ��C��� "�� ���}!1AQa"q2���#B��R��$3br� %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������������������������������������������������������������������������� ���w!1AQaq"2�B���� #3R�br� $4�%�
当我点击查看->字符编码并选择任何编码时,图像显示正确

但是,在IE上,图像显示正确

我正在使用 Firefox18.0.1 IE 10

更新1:在localhost上,对于所有类型的浏览器,图像都能正确显示

更新2:添加Blob Viewer的屏幕截图

更新3:添加代码

views.py

class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        # アップロードされたファイルの情報を取得
        files = self.get_uploads('file')
        blob_info = files[0]

        # redirect メソッドが上手く動かないので、ステータスコードとヘッダを使って
        # ブラウザにリダイレクトを指示
        headers = dict(Location=utils.url_for('myapp/serve', blob_key=blob_info.key()))
        return werkzeug.Response(None, headers=headers, status=302)


class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self, blob_key):
        blob_key = str(urllib.unquote(blob_key))
        blob_info = blobstore.BlobInfo.get(blob_key)
        return self.send_blob(blob_info)

def testfile(request):
    # アップロード用の URL を作成
    # アップロードに成功したら core/upload エンドポイントへ移動させる
    upload_url = blobstore.create_upload_url(utils.url_for('myapp/upload'))

    # Blobstore に保存されているファイルをすべて取得
    files = blobstore.BlobInfo.all()

    # テンプレートを使って表示
    data = dict(
            upload_url=upload_url,
            files=files)
    return utils.render_to_response('myapp/testfile.html', data)
url.py

Rule('/testfile', endpoint='testtile', view='myapp.views.testfile'),
    Rule('/upload', endpoint='upload', view=('myapp.views.UploadHandler', (), {})),
    Rule('/serve/<blob_key>', endpoint='serve', view=('myapp.views.ServeHandler', (), {})), 
规则('/testfile',endpoint='testtile',view='myapp.views.testfile'),
规则('/upload',endpoint='upload',view=('myapp.views.UploadHandler',(),{})),
规则('/serve/',endpoint='serve',view=('myapp.views.ServeHandler',(),{})),
testfile.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Top Page - core</title>
    </head>
    <body>
        <form action="{{ upload_url }}" method="POST" enctype="multipart/form-data">
            Upload File:<input type="file" name="file"><br>
            <input type="submit" name="submit" value="Submit">
        </form>

        <h2>Uploaded Files</h2>
        <ul>
            {% for file in files %}
            <li><a href="{{ url_for('myapp/serve', blob_key=file.key()     ) }}">{{ file.filename }}</a></li>
            {% endfor %}
        </ul>
    </body>
</html>

首页-核心
上传文件:
上传文件
    {文件%中的文件为%s}
  • {%endfor%}
更新4:我发现,在上传图像并正确显示其缩略图的地方,正常图像没有正确显示。不同之处在于,当显示缩略图图像时,会使用
mimetype='image/jpg'
。因此,我想我需要将此代码添加到某个地方,但我不知道在哪里

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self, blob_key):
        blob_key = str(urllib.unquote(blob_key))
        blob_info = blobstore.BlobInfo.get(blob_key)
        return self.send_blob(blob_info)
应该改成

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self, blob_key):
        blob_key = str(urllib.unquote(blob_key))
        blob_info = blobstore.BlobInfo.get(blob_key)
        return self.send_blob(blob_info,'image/jpg')

听起来内容类型标题缺失或不正确。IE通常会尝试解析它,这有时很方便,但也有它自己的问题,而其他浏览器对它的要求更严格。谢谢你的帮助。我刚刚添加了更新1。顺便说一句,包含图像的没有文本,因为它不是html,但是http头(使用livehttpheader或chrome开发者控制台)表示它是text/html。我怀疑上传时出错了,因为内容类型与blob一起存储。我认为上传是正确的,因为当我在Blob视图上检查内容类型时,文件类型是正确的。同样奇怪的是,它可以在localhost上运行,但不能在appspot.com上运行。werkzeug机器是否自动设置内容类型?尝试向app.yaml添加一个指向常规webapp2处理程序的新条目,并直接从根目录服务,如/service而不是/testapp/service