Python CGI - 如何在TCP服务器上获取上传文件?

时间:2014-05-18 08:57:28

标签: python upload cgi multipart

我像这样制作了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

1 个答案:

答案 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'})

理想情况下,当然会从传入的标头中解析该标头。