我像这样制作了TCP服务器
serverPort = 8181
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(('', serverPort))
serverSocket.listen(5)
我可以像这样接收用户的登录数据
elif path == '/login':
header, query = message.split(b'\r\n\r\n')
fp = io.BytesIO(query)
form = cgi.FieldStorage(fp, environ={'REQUEST_METHOD':'POST'})
connectionSocket.send(b'HTTP/1.1 200 OK\r\n')
connectionSocket.send(b'Content-type: text/html\r\n\r\n')
connectionSocket.send('<p>Hello {}!</p>'.format(form.getvalue('id')).encode('utf-8'))
但我无法收到多部分上传数据!! T ^ T
我为上传文件编写了HTML
<HTML>
<BODY>
<FORM ENCTYPE="multipart/form-data" ACTION="http://127.0.0.1:8181/upload" METHOD=POST>
File to process: <INPUT NAME="file" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
</BODY>
</HTML>
如何收到文件并保存?
我知道使用HTTP服务器是解决这个问题的好方法
但是我这样使用TCP服务器......
请帮帮我!我无法解决这个问题... T ^ T
答案 0 :(得分:0)
文件上传使用不同的内容类型;通常情况下,POST使用application/x-www-form-urlencoded
,但文件上传要求表单使用multipart/form-data
。
cgi.FieldStorage
类通常会从CGI环境变量中嗅探它,但是你没有在这里使用CGI,你正在解析最低级别的所有内容。您必须在此处传递CONTENT_TYPE
标题:
form = cgi.FieldStorage(fp, environ={
'REQUEST_METHOD':'POST', 'CONTENT_TYPE': 'multipart/form-data'})
理想情况下,当然会从传入的标头中解析该标头。