如何在python3中通过http传输二进制文件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在python3中通过http传输二进制文件?相关的知识,希望对你有一定的参考价值。
我经常搜索,但没找到有用的东西。 在我的情况下,我想在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
答案
假设我们有一个名为image.png
的png格式的图像,我们希望通过http将其传输到客户端(例如Webbrowser)。
import socket
def getPic():
filebuffer = ""
header = "HTTP/1.1 200 OK
Content-type: image/png
"
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()
Please note the following codes cut out from above code:
header = "HTTP/1.1 200 OK
Content-type: image/png
"
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)
Why do you check, if the response body is in string or bytes?
如果我用上面的代码打开一个文本文件,如果没有这个,我会收到错误。所以我决定将所有纯文本编码为ASCII字符集。
Why are the http headers in ASCII coding?
因为它是在W3C规范中指定的
Why takes the return statement two values
它会在执行此操作时清除代码,并且您无法将字符串与字节组合在一起而无法正常工作。
How to tell the client that I am going to send an image in png format?
W3C有一个称为MIME类型的解决方案,这些是各种文件格式的一组预定义和可扩展值。例如。 image/png
说他在浏览器中获得了.png格式的图像文件。对于JavaScript,它将是application/javascript
等
以上是关于如何在python3中通过http传输二进制文件?的主要内容,如果未能解决你的问题,请参考以下文章
在期望脚本中通过 ssh/telnet(甚至是 shell)传输二进制数据时出错