【发布时间】:2011-08-05 16:20:53
【问题描述】:
我目前正在尝试使用 Python 提供 MP3 文件。问题是我只能播放一次 MP3。之后媒体控件停止响应,我需要重新加载整个页面才能再次收听 MP3。 (在 Chrome 中测试)
问题:运行下面的脚本,在我的浏览器上输入http://127.0.0.1/test.mp3会返回一个MP3文件,只有刷新页面才能重播
注意事项:
将页面保存为 HTML 并直接使用 Chrome 加载(没有 Python 服务器)会使问题消失。
-
使用 Apache 提供文件可以解决问题,但这有点过头了:我想让脚本非常易于使用,并且不需要安装 Apache。
李>
这是我使用的代码:
import string
import os
import urllib
import socket
# Setup web server import string,cgi,time
import string,cgi,time
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import hashlib
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
try:
# serve mp3 files
if self.path.endswith(".mp3"):
print curdir + sep + self.path
f = open(curdir + sep + self.path, 'rb')
st = os.fstat( f.fileno() )
length = st.st_size
data = f.read()
md5 = hashlib.md5()
md5.update(data)
md5_key = self.headers.getheader('If-None-Match')
if md5_key:
if md5_key[1:-1] == md5.hexdigest():
self.send_response(304)
self.send_header('ETag', '"{0}"'.format(md5.hexdigest()))
self.send_header('Keep-Alive', 'timeout=5, max=100')
self.end_headers()
return
self.send_response(200)
self.send_header('Content-type', 'audio/mpeg')
self.send_header('Content-Length', length )
self.send_header('ETag', '"{0}"'.format(md5.hexdigest()))
self.send_header('Accept-Ranges', 'bytes')
self.send_header('Last-Modified', time.strftime("%a %d %b %Y %H:%M:%S GMT",time.localtime(os.path.getmtime('test.mp3'))))
self.end_headers()
self.wfile.write(data)
f.close()
return
except IOError:
self.send_error(404,'File Not Found: %s' % self.path)
from SocketServer import ThreadingMixIn
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
if __name__ == "__main__":
try:
server = ThreadedHTTPServer(('', 80), MyHandler)
print 'started httpserver...'
server.serve_forever()
except KeyboardInterrupt:
print '^C received, shutting down server'
server.socket.close()
【问题讨论】:
-
你试过数据包嗅探器了吗?
-
尝试设置 content-disposition: 附件头
-
或者更好:使用 Python 网络框架为您完成工作 :)
-
content-disposition 不会改变任何东西。我想要一些简单的东西来分享和运行,对于 50 行的脚本来说,使用 Python 网络框架真的太过分了