Надеюсь, что мне кто-нибудь поможет понять.
Версия Python 3.1,Денвер, Винда.
Я написал небольшую функцию, которя читает входящий поток, переданный методом POST в формате multipart/form-data.
Всё вроде бы замечательно, но стоит передать допустим картинку, начинаются проблемы.
В теле передаётся лишь часть содержимого картинки.
То есть допустим читаю тело картинки, потом записываю в файл, открываю её и чёрный экран, либо картинка показывается частично.
Вот ветка в функции, которая разбирает поток в формате multipart/form-data.
Убрал всё лишнее. Вставил некоторые комментарии, где возникают проблемы.Данный код лишь для примера, он может и не работать.
—
res = re.search("boundary\=(.*)",os.environ['CONTENT_TYPE'],re.I)
boundary = res.group(1)
name = ""
step = True
dVars = {}
pStream = sys.stdin # Если вывести pStream с помощью print() выдаётся <_io.TextIOWrapper name='' encoding='cp1251'>
while step:
line = pStream.readline() # Иногда при чтении строки тела картинки вылетает ошибка UnicodeDecodeError
line = parse.unquote(line.replace("+"," "),encoding=encodeName) # в моём случае encodeName='cp1251'
if bool(line) == False: step = False; continue
if 'name=' in line and name == "":
res = re.search("name\=(?:\"|\'|)([^\"\'\s]+)",line)
name = res.group(1)
keyDict = re.search("\[([^\]]*)\]",name)
if keyDict != None:
name = name[:-(len(keyDict.group(0)))]
if name not in dVars: dVars[name] = {}
if len(keyDict.group(1)) > 0:
keyDict = keyDict.group(1)
else:
keyDict = str(len(dVars[name]))
dVars[name][keyDict] = ""
else:
dVars[name] = ""
pStream.readline()
elif boundary in line:
name = ""
else:
if keyDict != None:
dVars[name][keyDict] += line.strip()
else:
dVars[name] += line.strip()
Я бы не стал сюда писать, если бы не было тех же проблем при использовании cgi.FieldStorage().
У кого-нибудь есть какие-нибудь мысли?
В принципе всё работает, если не передавать файлы.
И у меня единственное предположение, что когда python читает поток в кодировке cp1251, то не все символы в этой кодировке определяются.
Но я не знаю, как это всё работает на самом деле, не хотелось бы гадать.