我正在通过POST向我的服务器发送带有python脚本中字符串的文本文件:
fo = open('data'.txt','a')
fo.write("hi, this is my testing data")
fo.close()
with open('data.txt', 'rb') as f:
r = requests.post("http://XXX.XX.X.X", data = {'data.txt':f})
f.close()
在我的服务器处理程序脚本中接收和处理它,在网上找到了一个例子:
def do_POST(self):
data = self.rfile.read(int(self.headers.getheader('Content-Length')))
empty = [data]
with open('processing.txt', 'wb') as file:
for item in empty:
file.write("%s\n" % item)
file.close()
self._set_headers()
self.wfile.write("<html><body><h1>POST!</h1></body></html>")
我的问题是,如何:
self.rfile.read(int(self.headers.getheader('Content-Length')))
取我的数据长度(整数,字节数/字符数)并读取我的文件?我很困惑它如何知道我的数据包含什么。 HTTP幕后发生了什么?
输出data.txt=hi%2C+this+is+my+testing+data
到我的processing.txt,但我期待"hi this is my testing data"
我尝试但未能找到rfile.read()的确切文档,如果只是找到答案我的问题我会很感激,我可以删除这个问题。
答案 0 :(得分:1)
您的客户端代码段从文件data.txt
读取内容,并向服务器发出POST请求,其数据结构为键值对。在这种情况下发送到您的服务器的数据是一个键data.txt
,相应的值是文件的内容。
您的服务器代码段读取整个 HTTP请求正文并将其转储到文件中。从客户端构建和发送的键值对的格式可由Python的内置库urlparse
解码。
这是一个可行的解决方案:
def do_POST(self):
length = int(self.headers.getheader('content-length'))
field_data = self.rfile.read(length)
fields = urlparse.parse_qs(field_data)
这段代码可耻地借鉴于:https://stackoverflow.com/a/31363982/705471
如果您想要提取文本文件的内容,请将以下代码行添加到上面的代码段中:
data_file = fields["data.txt"]
要详细了解如何针对HTTP编码此类信息,请参阅:https://en.wikipedia.org/wiki/Percent-encoding