You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gunicorn返回JPG/JPEG图片无法正常渲染该如何解决?

问题根因

你的代码存在3处直接导致图片加载失败的问题:

  • 错误对图片做Base64编码:image/jpeg响应要求返回原始JPEG二进制流,Base64编码仅适用于HTML内联图片(data:image/jpeg;base64,xxx格式)的场景,把编码后的内容当图片返回,浏览器无法识别为有效图片格式。
  • 文件路径读取逻辑错误:请求的PATH_INFO是带前导斜杠的绝对路径(比如日志里的/media/zombie1.jpeg),直接把这个值传给open()会从系统根目录开始查找文件,而非你项目的静态资源目录,大概率会触发文件不存在的IO错误,导致请求异常。
  • 编码逻辑冗余混乱:自定义的encode变量判断分支完全没必要,二进制图片内容不需要做UTF-8编码,字符串和bytes类型混用很容易触发类型错误。
修复方案

删掉无效的Base64编码逻辑,修正静态文件路径映射,补全基础的异常和安全校验,修改后的完整代码如下:

import os

# 配置静态资源根目录,替换为你实际存放图片的文件夹绝对路径,示例为脚本同目录下的media文件夹
STATIC_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "media")

def app(environ, start_response):
    req_path = environ.get("PATH_INFO", "")
    resp_body = b""
    content_type = "text/html; charset=utf-8"
    status = "200 OK"

    # 匹配JPEG图片请求
    if req_path.endswith((".jpeg", ".jpg")):
        content_type = "image/jpeg"
        # 拼接安全的本地文件路径,拦截路径穿越攻击
        safe_path = os.path.normpath(os.path.join(STATIC_DIR, req_path.lstrip("/")))
        if not safe_path.startswith(STATIC_DIR):
            status = "403 Forbidden"
            resp_body = b"403 Access Denied"
        elif not os.path.isfile(safe_path):
            status = "404 Not Found"
            resp_body = b"404 File Not Found"
        else:
            # 直接读取原始二进制内容,不做任何编码转换
            with open(safe_path, "rb") as f:
                resp_body = f.read()
    else:
        # 处理HTML请求
        context = {"path": req_path, "pageTitle": "home"}
        resp_body = template("template.html", context).encode("utf-8")

    response_headers = [
        ("Content-Type", content_type),
        ("Content-Length", str(len(resp_body)))
    ]
    start_response(status, response_headers)
    return iter([resp_body])
验证注意事项
  • 先确认STATIC_DIR配置的路径和你实际存放JPEG文件的路径完全一致,比如请求/zombie1.jpeg对应读取STATIC_DIR/zombie1.jpeg,请求/media/zombie1.jpeg对应读取STATIC_DIR/media/zombie1.jpeg
  • 重启Gunicorn服务后刷新页面,在浏览器开发者工具的网络面板中查看图片请求:状态码为200、响应头Content-Type为image/jpeg时,图片即可正常渲染。

内容的提问来源于stack exchange,提问作者jaycer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:06:24