Мы получаем некоторые POST-данные xml + произвольных двоичных файлов (например, изображений и аудио) от устройства, которое дает нам только многочастное / смешанное кодирование.
Я установил вишневый обработчик загрузки / POST для нашего получателя. Мне удалось разрешить ему делать произвольное количество параметров, используя multipart / form-data. Однако, когда мы пытаемся отправить смешанные данные, состоящие из нескольких частей, мы не получаем никакой обработки.
@cherrypy.expose
def upload(self, *args,**kwargs):
"""upload adapted from cherrypy tutorials
We use our variation of cgi.FieldStorage to parse the MIME
encoded HTML form data containing the file."""
print args
print kwargs
cherrypy.response.timeout = 1300
lcHDRS = {}
for key, val in cherrypy.request.headers.iteritems():
lcHDRS[key.lower()] = val
incomingBytes = int(lcHDRS['content-length'])
print cherrypy.request.rfile
#etc..etc...
Итак, при отправке multipart / form-data аргументы и kwargs четко определены. args - это поля формы, kwargs = хэш переменных и значений. Когда я отправляю multipart / mixed, args и kwargs пусты, и у меня есть только cherrypy.request.rfile в качестве необработанной информации POST.
Мой вопрос: есть ли у Cherrypy встроенный обработчик для обработки multipart / смешанного и фрагментированного кодирования для POST? Или мне нужно будет переопределить cherrypy.tools.process_request_body и свернуть собственный декодер?
Похоже, что встроенный wsgi-сервер с cherrypy обрабатывает это как часть спецификации HTTP / 1.1, но мне не удалось найти документацию в cherrypy для доступа к этой функции.
... уточнить
Я использую Cherrypy последней версии 3.1.1 или около того.
Создание формы по умолчанию включает в себя создание параметров в функции загрузки.
Для multipart / form-data я вызвал curl -F [email protected] -F param2 = sometext -F [email protected] http: // пункт назначения: порт / загрузка
В этом примере я получаю:
args = ['param1','param2','param3]
kwargs = {'param1':CString<>, 'param2': 'sometext', 'param3':CString<>}
При попытке отправить multipart / mixed я попытался посмотреть на request.body, но продолжал получать для этого None, независимо от настройки обработки тела.
Мы получаем следующие данные:
user-agent:UNTRUSTED/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1
content-language:en-US
content-length:565719
mime-version:1.0
content-type:multipart/mixed; boundary='newdivider'
host:192.168.1.1:8180
transfer-encoding:chunked
--newdivider
Content-type: text/xml
<?xml version='1.0' ?><data><Stuff>....
etc...etc...
--newdivider
Content-type: image/jpeg
Content-ID: file://localhost/root1/photos/Garden.jpg
Content-transfer-encoding: binary
<binary data>
У меня есть подозрение, что multipart / mixed - это проблема, которую cherrypy просто дает мне только rfile. Наша цель - заставить Cherrypy разделить тело на части с минимальной обработкой на принимающей стороне (т.е. позволить Cherrypy творить чудеса). Если это требует от нас более жестких подходов к формату отправки, чтобы он был типом контента, который нравится Cherrypy, то пусть будет так. Какие форматы принимаются? Это только multipart / form-data?
Вместо rfile посмотрите cherrypy.request.body, если Content-Type не является данными формы.






Виноват. Когда Content-Type имеет тип multipart / *, CP пытается вставить содержимое в request.params (если какой-либо другой Content-Type, он переходит в request.body).
К сожалению, CP предположил, что любое составное сообщение является данными формы, и не предусмотрел другие подтипы. Я только что исправил это в багажнике, и он должен быть выпущен в версии 3.1.2. Извините за причиненные неудобства. В краткосрочной перспективе вы можете попробовать применить набор изменений локально; см. http://www.cherrypy.org/ticket/890.
Эй, спасибо, это сработало как шарм. Теперь можно с легкостью извлекать все части из cherrypy.request.params ['parts']. Спасибо!
Я ищу такой же ответ и нашел это: svn.cherrypy.org/trunk/cherrypy/_cpreqbody.py. В нем объясняется, как Cherrypy обрабатывает данные multipart post с необработанными байтами, но я еще не понял, как решить эту проблему.
Итак, как мне сохранить этот входящий материал: [<объект cherrypy._cpreqbody.Part в 0x7fd95a409a90>, <объект cherrypy._cpreqbody.Part в 0x7fd95a178190>] на диск как локальный файл?
Ссылка на тикет мертва, что делает этот ответ бесполезным для меня. :(
какая версия Cherrypy, и можете ли вы сделать образец HTML-формы?