如何用Python BaseHTTPServer的do_GET方法提供图片内容类型?
我正在使用BaseHTTPServer来提供网页内容。我可以提供内容类型为'text/html'、'text/css',甚至是'text/js',这些在浏览器中都能正常显示。但是当我尝试
self.send_header('Content-type', 'image/png')
来处理一个.png文件时,它根本不显示。
这里有一个示例:
if self.path.endswith(".js"):
f = open(curdir + sep + self.path)
self.send_response(200)
self.send_header('Content-type', 'text/javascript')
self.end_headers()
self.wfile.write(f.read())
f.close()
return
这对于JavaScript来说效果很好。
if self.path.endswith(".png"):
f=open(curdir + sep + self.path)
self.send_response(200)
self.send_header('Content-type', 'image/png')
self.end_headers()
self.wfile.write(f.read())
f.close()
return
但是当我为客户端标记图像内容时,它似乎并没有显示出来,反而显示为一个损坏的图像。
有什么想法吗?
3 个回答
1
你可以随时以二进制的方式打开文件 ;-)
也许你可以看看 SimpleHTTPServer.py 这个文件中的这部分代码:
ctype = self.guess_type(path) try: # Always read in binary mode. Opening files in text mode may cause # newline translations, making the actual size of the content # transmitted *less* than the content-length! f = open(path, 'rb') except IOError: self.send_error(404, "File not found") return None
然后如果你看看 def guess_type(self, path): 这个函数,它其实很简单,它是用文件的“扩展名”来判断的 ;-)
Return value is a string of the form type/subtype, usable for a MIME Content-type header. The default implementation looks the file's extension up in the table self.extensions_map, using application/octet-stream as a default; however it would be permissible (if slow) to look inside the data to make a better guess.
顺便说一下,代码是:
base, ext = posixpath.splitext(path) if ext in self.extensions_map: return self.extensions_map[ext] ext = ext.lower() if ext in self.extensions_map: return self.extensions_map[ext] else: return self.extensions_map['']
3
试着使用 SimpleHTTPServer
class MyHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
"""modify Content-type """
def guess_type(self, path):
mimetype = SimpleHTTPServer.SimpleHTTPRequestHandler.guess_type(
self, path
)
if mimetype == 'application/octet-stream':
if path.endswith('manifest'):
mimetype = 'text/cache-manifest'
return mimetype
想了解更多信息,可以查看 /usr/lib/python2.7/SimpleHTTPServer.py。
9
你打开文件时用了文本模式,而不是二进制模式。这可能会导致换行符出现问题。你可以试试这样做:
f = open(curdir + sep + self.path, 'rb')