如何将图像编码以便通过Python HTTP服务器发送?

11

我需要关于下面 handler 的帮助:

 class MyHandler(http.server.BaseHTTPRequestHandler):
     def do_HEAD(client):
        client.send_response(200)
        client.send_header("Content-type", "text/html")
        client.end_headers()
     def do_GET(client):
        if client.path == "/":
           client.send_response(200)
           client.send_header("Content-type", "text/html")
           client.end_headers()

           client.wfile.write(load('index.html'))

 def load(file):
    with open(file, 'r') as file:
    return encode(str(file.read()))

 def encode(file):
    return bytes(file, 'UTF-8')
我知道了,函数load()是文件中的某个其他人。通过我的HTTP处理程序发送HTML页面似乎可以工作,但如何发送图像?我需要如何编码它,以及应该使用什么Content-type
非常感谢您的帮助!
(附注:如果连接到我的http服务器,则希望在浏览器中看到发送的图像。)
2个回答

14

对于PNG图像,您需要将内容类型设置为"image/png"。对于jpg:"image/jpeg"。

其他内容类型可以在此处找到。

编辑:是的,我在第一次编辑中忘记了编码。

答案是:不需要!当您从文件加载图像时,它已经具有正确的编码。

我了解了您的解码器问题:根据我在您的load函数中所看到的,问题在于您尝试对文件内容进行编码。

您可以使用以下内容用于二进制数据:

def load_binary(filename):
    with open(filename, 'rb') as file_handle:
        return file_handle.read()

当我将'r'更改为'rb'时,它会加载大约3分钟,我有1000行随机单词... - Thomas Wagenaar
我刚试了一下你的load_binary函数,但是我遇到了这个错误:'charmap'编解码器无法解码位置600处的0x81字节:字符映射到<未定义>。 - Thomas Wagenaar
在这种情况下,方法client.wfile.write期望ASCII数据。我不知道您使用的Web服务器 - 也许有一种不同的方法可以处理二进制数据? - Juergen
可能是因为我正在使用“UTF-8”进行编码,我应该使用其他编码吗? - Thomas Wagenaar
问题在于你好像是在使用 Python 3,而我对它的经验还不够丰富。但是 Python(2 和 3)的问题之一就是编码问题。你必须将文件以二进制文件的形式读入,否则 Python 将尝试将其作为文本读取,而这在处理二进制文件时是行不通的。我已经修改了上面的代码,请尝试一下这个版本吧(使用 'rb' 而不是 'r')。我希望,在这种情况下,http 模块能够发送未编码的二进制数据。 - Juergen

3

这个内容有点有用,但是从Python 2转换到3并不容易,因为在Python 3中,您必须将所有数据编码为字节...否则它就无法工作,我刚刚测试过。 - Thomas Wagenaar
1
我应该提供更多的信息...第39行必须更改。你必须以二进制模式打开它:f = open(curdir + sep + self.path, 'rb')此外,print语句和导入(from BaseHTTPServer import [...]而不是from http.server import [...])也必须更改。 - Liblor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接