У меня есть упрощенное веб-приложение CherryPy 3.2, работающее на Windows 7, которое позволяет мне успешно загружать несколько файлов.Однако в данный момент приложение не сохраняет и не делает ничего особенного с загруженными файлами.Я просто хочу сначала провести тестирование.В любом случае, фрагмент HTML содержит эти строки
<form id="myform" action="doUpload" enctype="multipart/form-data" method="post">
<input type="file" id="files" name="files" multiple />
<input type="submit" id="button" />
</form>
Соответствующий диспетчер CherryPy 3.2 (с удалением некоторых строк кода) начинается с
@cherrypy.expose
def doUpload(self, **kwargs):
try:
filesUploaded = 0
for f in kwargs['files']:
self.performActualUpload(f)
filesUploaded = filesUploaded + 1
if filesUploaded < 1: self.performActualUpload(kwargs['files'])
except KeyError:
pass
Метод self.performActualUpload () имееточень простой цикл, который просто подсчитывает количество прочитанных байтов и печатает общее количество.(Я не использовал никаких функций ведения журналов; я просто выгружаю весь вывод в командную строку Windows 7).
size = 0
while True:
try:
data = f.file.read(8192)
if not data:
break
size += len(data)
except AttributeError:
size = 0
print ("total bytes transferred is {}".format(size))
Я обнаружил, что вывод из self.performActualUpload () генерируется только после все файлы были загружены, а не во время передачи.Я хочу отслеживать количество байтов в пути, чтобы я мог обновлять поле HTML либо с помощью растущего индикатора выполнения, либо просто постоянно меняющейся числовой суммы.
Я просматривал результаты поиска в Google и наткнулся наэтот поток http://old.nabble.com/File-upload-stats-in-CP-3.0-td13499294.html, который говорит о отслеживании статистики загрузки файлов в CherryPy 3.0, но не с версией 3.2 платформы HTTP.
Я понимаю, что upload_stats () должен бытьнепрерывно вызывается с чем-то вроде jQuery POST, чтобы спросить CherryPy 3.2 о последней статистике загрузки.Я также понимаю, что мне нужно создать объект FieldStorage (объект с переопределенным методом make_file ()).Однако я не могу понять, как успешно создать экземпляр объекта FieldStorage.Я попробовал следующие строки кода в моем диспетчере doUpload ()
lcHDRS = {}
for key, val in cherrypy.request.headers.items():
lcHDRS[key.lower()] = val
formFields = FieldStorage(fp=cherrypy.request.rfile,
headers=lcHDRS,
environ={'REQUEST_METHOD':'POST'},
keep_blank_values=True)
только для получения этого сообщения об ошибке
ValueError: <cherrypy.wsgiserver.KnownLengthRFile object at 0x0000000003959198>
should return bytes, got str
KnownLengthRFile - это оболочка вокруг файловоподобного объекта.Я пытался преобразовать str в байты, но это не сработало.Итак, я в полном недоумении, как поступить с этого момента.По общему признанию, мои знания Python 3.2 и CherryPy 3.2 в настоящее время весьма ограничены.
Есть ли кто-нибудь, кто может мне помочь?Опять же, я пытаюсь адаптировать фрагменты кода на http://old.nabble.com/File-upload-stats-in-CP-3.0-td13499294.html в веб-приложение CherryPy 3.2.Есть также некоторые вопросы, касающиеся всего взаимодействия AJAX (например, вызов upload_stats (), получение сущности JSON и ее анализ), но я оставлю это на другой раз.Спасибо.