我有一个简单的CherryPy 3.2 Web应用程序,在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字段。
我已经浏览过谷歌搜索,偶然发现了这个线程http://old.nabble.com/File-upload-stats-in-CP-3.0-td13499294.html,它讨论了在CherryPy 3.0中跟踪文件上传统计数据,但不是与HTTP框架的3.2版本。
据我所知,必须使用jQuery POST等连续调用upload_stats()来向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 Web应用程序。围绕整个AJAX交互还有一些问题(即调用upload_stats(),接收JSON实体并解析它)但我会保留另一个时间。感谢。
答案 0 :(得分:2)
使用yield并返回实际上传文件大小的流式传输。
您可以在此处查看带有cherrypy的收益率:http://www.cherrypy.org/wiki/ReturnVsYield
这是收益率适合的情况之一。