Отслеживание загрузки нескольких файлов в Cherrypy 3.2 - PullRequest
2 голосов
/ 28 апреля 2011

У меня есть упрощенное веб-приложение 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 и ее анализ), но я оставлю это на другой раз.Спасибо.

1 Ответ

2 голосов
/ 19 сентября 2011

Используйте yield и возвращайте потоковую передачу с фактическим размером загруженного файла.

Здесь вы можете проверить урожай с помощью cherrypy: http://www.cherrypy.org/wiki/ReturnVsYield

Это один из случаев, когда выход соответствует.

...