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
相关产品推荐
相关产品推荐

