如何在python3中通过http传输二进制文件?

时间:2017-10-16 12:25:49

标签: python-3.x http binary binaryfiles

我搜索了很多,但找不到有用的东西 在我的情况下,我想在python3中编写一个web服务器,当然必须处理二进制文件和文本文件。

sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockobj.bind(('localhost',8080))
sockobj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sockobj.listen(1)
while True:
    conn, address = sockobj.accept()
    data = conn.recv(1024)
    head, data = getPic()
    conn.sendall(head + data) # Does not work at all
    conn.close()

我查看了维基百科:https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

1 个答案:

答案 0 :(得分:2)

假设我们有一个名为image.png的png格式的图像,我们希望通过http将其传输到客户端(例如Webbrowser)。

import socket
def getPic():
    filebuffer = ""
    header = "HTTP/1.1 200 OK\r\nContent-type: image/png\r\n\r\n"
    sfile = open("image.png", "rb")
    filebuffer = sfile.read()
    sfile.close()
    return header, filebuffer
def main():
    sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sockobj.bind(('localhost',8080))
    sockobj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sockobj.listen(1)
    while True:
        conn, address = sockobj.accept()
        data = conn.recv(1024)
        head, data = getPic()
        if str(type(data)).find("str") > -1:
            conn.sendall(bytes(head + data, "ASCII"))
            #Since the most text files are in UTF-8 encoding, you can use the following instead:
            #conn.sendall(bytes(head, "ASCII") + bytes(data, "UTF-8")) 
        else:
            conn.sendall(bytes(head, "ASCII") + data)
        conn.close()
main()

<小时/>

请注意以下代码:

header = "HTTP/1.1 200 OK\r\nContent-type: image/png\r\n\r\n"
sfile = open("image.png", "rb")
filebuffer = sfile.read()
sfile.close()
return header, filebuffer

head, data = getPic()
    if str(type(data)).find("str") > -1:
        conn.sendall(bytes(head + data, "ASCII"))
    else:
        conn.sendall(bytes(head, "ASCII") + data)

<小时/>

为什么检查响应主体是字符串还是字节?

如果我用上面的代码打开一个文本文件,如果没有,我会收到错误。所以我决定将所有纯文本编码为ASCII字符集。

为什么ASCII编码中的http标头?

因为它是在W3C规范中指定的

为什么return语句有两个值

它会在执行此操作时清除代码,并且您无法将字符串与字节组合在一起而无法正常工作。

如何告诉客户我打算以png格式发送图像?

W3C有一个称为MIME类型的解决方案,这些是各种文件格式的一组预定义和可扩展值。例如。 image/png表示浏览器以 .png 格式获取图像文件。对于javascript,它将是application/javascript,依此类推