5

我正在使用 BaseHTTPServer 来提供 Web 内容。我可以提供内容类型“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

当我将其标记为客户端时,这似乎不会呈现图像内容。它显示为损坏的图像。

有任何想法吗?

4

3 回答 3

9

您已经以文本模式而不是二进制模式打开了文件。任何换行符都可能搞砸。改用这个:

f = open(curdir + sep + self.path, 'rb')
于 2011-03-13T04:34:50.453 回答
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。

于 2012-04-06T05:21:50.503 回答
1

您始终可以将文件作为二进制文件打开;-)

也许您可以在这部分代码中查看 SimpleHTTPServer.py:

    ctype = self.guess_type(路径)
    尝试:
        # 始终以二进制模式读取。以文本模式打开文件可能会导致
        # 换行翻译,使内容的实际大小
        # 传输的*小于*内容长度!
        f = 打开(路径,'rb')
    除了 IOError:
        self.send_error(404, "文件未找到")
        返回无

然后,如果您查看defguess_type(self, path):它非常简单,它使用文件“扩展名”;-)

    返回值是表单类型/子类型的字符串,
    可用于 MIME 内容类型标头。

    默认实现看起来文件的扩展名
    在表 self.extensions_map 中,使用 application/octet-stream
    默认情况下;但是这是允许的(如果
    慢)查看数据内部以做出更好的猜测。

以防万一,代码是:

    基础,分机 = posixpath.splitext(路径)
    如果 self.extensions_map 中的 ext:
        返回 self.extensions_map[ext]
    ext = ext.lower()
    如果 self.extensions_map 中的 ext:
        返回 self.extensions_map[ext]
    别的:
        返回 self.extensions_map['']

于 2011-11-16T17:07:37.263 回答