cherrypy3.2中的多文件上传跟踪

2024-05-05 05:40:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的cherrypy3.2web应用程序,运行在windows7上,它允许我成功地上传多个文件。不过,目前应用程序不保存上载的文件,也不做任何特殊处理。我只是想先做些测试。无论如何,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>

相应的cherrypy3.2调度器(删除了一些代码行)以

^{pr2}$

在自我性能测试加载()方法有一个非常简单的循环,它只计算读取的字节数并打印总字节数。(我没有使用任何日志记录功能;我只是将所有输出转储到Windows7命令提示符)。在

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))

我发现自我性能测试加载()仅在上载所有文件后生成,而不是在传输过程中生成。我想要的是监视传输中的字节量,这样我就可以用一个不断增长的进度条或只是一个不断变化的数字总数来更新HTML字段。在

我在Google搜索中搜索了一下,偶然发现了这个线程http://old.nabble.com/File-upload-stats-in-CP-3.0-td13499294.html,它讨论了在cherrypy3.0中跟踪文件上传统计信息,但是在HTTP框架的3.2版本中,不是。在

我知道upload_stats()将必须以类似jQuery POST的方式连续调用,以请求cherrypy3.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转换成字节,但没用。所以,我完全不知道如何从这一点开始。诚然,目前我对python3.2和cherrypy3.2的了解还很有限。在

有人能帮我吗?同样,我正在尝试将http://old.nabble.com/File-upload-stats-in-CP-3.0-td13499294.html上的代码片段改编为CherryPy3.2Web应用程序。围绕整个AJAX交互也有一些问题(例如,调用upload_stats(),接收一个JSON实体并对其进行解析),但我将把它留到下一次讨论。谢谢。在


Tags: 文件对象代码informid应用程序data