如何用Python BaseHTTPServer的do_GET方法提供图片内容类型?

5 投票
3 回答
11727 浏览
提问于 2025-04-16 13:35

我正在使用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')

撰写回答