【问题标题】:Python CGI - How can I get uploaded file in TCP server?Python CGI - 如何在 TCP 服务器中获取上传的文件?
【发布时间】:2014-07-06 09:05:04
【问题描述】:

我做了这样的 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

【问题讨论】:

  • 读取文档到 cgi.FieldStorage
  • 既然有Flask或Pyramid,为什么要经历这么多痛苦,这是我想知道的。

标签: python upload cgi multipart


【解决方案1】:

文件上传使用不同的内容类型;通常 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'})

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

【讨论】:

  • 谢谢!我做了你的回答,但发生了错误..我写了我的完整源代码另一个问题!你能再帮帮我吗?链接是here
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2023-04-05
  • 2012-10-27
  • 2018-03-14
  • 2016-12-18
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多