使用twistd web服务docx文件时的下载异常问题
解决twistd web服务docx文件乱码并触发下载的问题
问题根源在于twistd默认的静态文件服务没有为docx文件设置正确的MIME类型和下载触发头,导致浏览器把二进制的docx文件当成纯文本解析,显示乱码;而pdf文件的MIME类型在twistd的默认映射中存在,所以能正常处理。
下面提供两种可行的解决方法:
方法一:自定义脚本扩展静态文件处理器
创建一个Python脚本(比如命名为custom_webserver.py),替换默认的静态文件处理逻辑,为docx文件添加正确的响应头:
from twisted.web import server, static from twisted.internet import reactor class DocxAwareFile(static.File): def render_GET(self, request): # 提取文件扩展名 file_ext = self.path.split('.')[-1].lower() if file_ext == 'docx': # 设置docx的标准MIME类型 request.responseHeaders.setRawHeaders( b'Content-Type', [b'application/vnd.openxmlformats-officedocument.wordprocessingml.document'] ) # 强制触发下载(若想让浏览器尝试打开,把attachment改成inline即可) filename = self.path.split('\\')[-1].encode('utf-8') request.responseHeaders.setRawHeaders( b'Content-Disposition', [b'attachment; filename="%s"' % filename] ) # 调用父类默认处理逻辑 return super().render_GET(request) # 初始化根目录,替换为你的共享路径 root_resource = DocxAwareFile(b'd:\\shares\\') # 创建站点并监听端口(此处用8080,可自行修改) site = server.Site(root_resource) reactor.listenTCP(8080, site) reactor.run()
运行脚本替代原twistd命令:
python custom_webserver.py
如果偏好twistd启动方式,可使用:
twistd -no web --class=custom_webserver.root_resource
方法二:扩展twistd的MIME类型映射(简化版)
这种方法仅解决MIME类型识别问题,让浏览器正确识别docx,但不会强制触发下载:
- 找到twisted安装目录下的
static.py文件(通常在Lib\site-packages\twisted\web\static.py) - 找到
contentTypes字典,添加一行:b'docx': b'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 保存后重启twistd服务
内容的提问来源于stack exchange,提问作者toto
相关产品推荐
相关产品推荐

