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

Python 3.4 HTTP服务器非文本文件加载异常排查求助

解决Python 3.4 HTTP服务器无法加载非文本文件的问题

你猜的没错——问题确实出在文件内容的编码和传输方式上。默认的BaseHTTPRequestHandler处理HTML、JS这类文本文件时没问题,但处理图片、音频这类二进制文件时,不能用文本模式读取,得用二进制模式,同时还要给浏览器返回正确的Content-Type头,不然浏览器不知道该怎么解析这些数据。

我直接给你修改好的代码,同时说明关键修复点:

修复后的完整代码

from http.server import BaseHTTPRequestHandler, HTTPServer
from os import curdir, sep
import subprocess
import mimetypes

# HTTPRequestHandler class
class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
    # GET
    def do_GET(self):
        # 处理根路径,默认返回index.html
        if self.path == '/':
            self.path = '/index.html'
        
        try:
            # 自动猜测文件的MIME类型
            mime_type, _ = mimetypes.guess_type(self.path)
            if mime_type is None:
                # 无法识别时用通用二进制类型
                mime_type = 'application/octet-stream'
            
            # 用二进制模式打开文件,避免编码破坏数据
            with open(curdir + sep + self.path, 'rb') as f:
                content = f.read()
            
            # 发送响应头
            self.send_response(200)
            self.send_header('Content-type', mime_type)
            self.send_header('Content-Length', str(len(content)))
            self.end_headers()
            
            # 直接发送二进制内容,不做编码转换
            self.wfile.write(content)
            return
        
        except IOError:
            # 处理404错误
            self.send_error(404, 'File Not Found: %s' % self.path)

def run():
    print('Starting server...')
    # 替换成你的IP和端口
    server_address = ('', 8080)
    httpd = HTTPServer(server_address, testHTTPServer_RequestHandler)
    print('Running server...')
    httpd.serve_forever()

if __name__ == '__main__':
    run()

关键修复点说明

  • 二进制模式读写:用'rb'模式打开文件,避免文本编码转换破坏图片的字节流;用self.wfile.write()直接发送二进制数据,不做任何编码处理。
  • 自动识别MIME类型:通过mimetypes.guess_type自动判断文件类型,给浏览器返回正确的Content-type(比如图片返回image/jpeg,PNG返回image/png),让浏览器知道该如何渲染内容。
  • 添加Content-Length头:告诉浏览器要接收的字节数,避免出现内容截断或加载异常的情况。

额外小提示

如果有一些特殊文件类型(比如WebP图片)无法被mimetypes识别,你可以手动添加映射:

mimetypes.add_type('image/webp', '.webp')

测试前记得清空浏览器缓存,避免之前的错误响应干扰结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:38:12