【问题标题】:python CGI : upload errorpython CGI:上传错误
【发布时间】:2014-07-06 14:12:21
【问题描述】:

我使用 Python 3.4 版

这是python中的服务器源代码

import io
from socket import *
import threading
import cgi

serverPort = 8181
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(('', serverPort))
serverSocket.listen(5)


def serverHandle(connectionSocket, addr):     
    try:
        message = connectionSocket.recv(1024)

        if not message:
            return

        path = message.split()[1].decode('utf-8')

        if path == '/':
            connectionSocket.send(b'HTTP/1.1 200 OK\r\n')
            connectionSocket.send(b'Content-type: text/html\r\n\r\n')
            with open('upload.html', 'rb') as f:
                connectionSocket.send(f.read())

        elif path == '/upload':
            header = message.split(b'\r\n\r\n')[0]
            query = message.split(b'\r\n\r\n')[-1]

            if not query:
                return

            fp = io.BytesIO(query)

            form = cgi.FieldStorage(fp, environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE': 'multipart/form-data'})

            f = open(form.filename, 'w')
            f.write(form.file)
            f.close()

        connectionSocket.close()

    except IOError:
        connectionSocket.send('404 File Not Found\r\n\r\n'.encode('utf_8'))
        connectionSocket.close()

while True:
    connectionSocket, addr = serverSocket.accept();
    threading._start_new_thread(serverHandle, (connectionSocket, addr))
serverSocket.close()

上传 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>

我尝试将文件上传到服务器并将文件保存在目录中 但是发生了这样的错误

Unhandled exception in thread started by <function serverHandle at 0x000000000240CBF8>
Traceback (most recent call last):
  File "C:\Users\Inwoo\Eclipse\workspace\WebServer\src\webserver1.py", line 36, in serverHandle
    form = cgi.FieldStorage(fp, environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE': 'multipart/form-data'})
  File "C:\Python34\lib\cgi.py", line 559, in __init__
    self.read_multi(environ, keep_blank_values, strict_parsing)
  File "C:\Python34\lib\cgi.py", line 681, in read_multi
    raise ValueError('Invalid boundary in multipart form: %r' % (ib,))
ValueError: Invalid boundary in multipart form: b''

我无法理解这个问题?

有时消息查询为空!

所以我写了if not query: return,对吗?

我如何接收上传的文件并将它们保存在服务器中?

【问题讨论】:

    标签: python upload cgi multipartform-data


    【解决方案1】:

    您需要将查询拆分为尽可能多的换行符;可以在其中嵌入换行符。在这里改用str.partition()

    header, _, query = message.partition(b'\r\n\r\n')
    

    您必须解析标题; Content-Type 标头包含多部分边界; FieldStorage 实例需要这个来确定字段的开始和结束位置。

    import re
    
    content_type = re.search(br'content-type:\s+(.*?)\r\n', header, flags=re.I).group(1)
    
    form = cgi.FieldStorage(fp, environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE': content_type})
    

    考虑到带有文件上传的 HTTP 消息很容易包含超过 1024 个字节;你只读过那么一点点。 只是标题可以轻松构成大部分消息;我的浏览器发送 819 个字节的标头并将其保存在一个数据包中。然后,您的connectionSocket.recv(1024) 调用将包含仅这些标头,您还需要读取更多数据。

    【讨论】:

    • 谢谢!但我也这样做了,并且发生了同样的错误。我编辑了我的问题和错误消息!我认为它有不同的问题..
    • 嗯..代码不起作用。并且发生了同样的错误,但我非常感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 2021-05-05
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多