gpt4 book ai didi

python CGI : upload error

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:10 25 4
gpt4 key购买 nike

我使用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,这是正确的吗?

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

最佳答案

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

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

您必须解析 header ; Content-Type header 包含多部分边界; 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 字节的 header 并将其保存在一个数据包中。然后,您的 connectionSocket.recv(1024) 调用将仅包含这些 header ,并且您仍需要读取更多数据。

关于 python CGI : upload error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23723830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com