【问题标题】:How to transfer binary files over http in python3?如何在 python3 中通过 http 传输二进制文件?
【发布时间】:2018-03-27 23:22:23
【问题描述】:

我搜索了很多,但没有找到有用的东西。
就我而言,我想在 python3 中编写一个网络服务器,当然这必须处理二进制和文本文件。

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

【问题讨论】:

    标签: python-3.x http binary binaryfiles


    【解决方案1】:

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

    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 字符集。

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

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

    为什么return语句取两个值

    这样做时它会清理代码,并且您不能将字符串与字节组合在一起,这是行不通的。

    如何告诉客户我要发送 png 格式的图片?

    W3C 有一个称为 MIME 类型的解决方案,它们是一组用于各种文件格式的预定义和可扩展值。例如。 image/png 说浏览器他得到一个 .png 格式的 image 文件。对于 javascript,它将是 application/javascript 等等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2010-09-25
      • 2011-08-27
      • 2017-03-08
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多