在web.py中使用xheditor上传接口开发上传功能笔记

这个问题让我彻夜难眠,誓死要解决它。我会把我的纠结写在下面,作为笔记,希望能帮助到那些纠结web.py的朋友。

关于web.py如何上传文件,直接看官方文档:http://webpy.org/cookbook/storeupload.zh-cn

xheditor的上传支持HTML4和HTML5的方式上传。根据抓包,知道HTML5上传方式是将HTTP_CONTENT_DISPOSITION写到HTTP请求头部,POST的内容就是整个文件的内容;HTML4上传是把HTTP_CONTENT_DISPOSITION内容放在POST数据里的。于是,web.py是这样接受数据的:

upFile = web.input(filedata={})

你会发现如果用xheditor上传api的话,会500错误,看apache的日志又会发现upFile变量引用不存在的键引发的KeyError异常。

这个问题就很明显了,firebug抓包,会发现是用的HTML5方式上传文件。于是,我跟踪web.py的源码,关于接受GET、POST、PUT的请求在webapi.py的278~313行是实现(web.py直接用标准库中的cgi处理的),发现,web.py不能处理HTML5的上传方式。

那么就只有用HTML4上传了,因为xheditor官方说支持HTML4和HTML5方式上传,于是我满谷歌满百度地搜索啊,都没发现如何单独调用HTML4方式上传。果断就看xheditor.js的源码,在1682~1708行找到了原因,原来xheditor先检查是否支持HTML5上传:

if(isOpera||!bHtml5Upload||(fromFiles.nodeType&&!((fileList=fromFiles.files)&&fileList[0].name)))

如果支持,则用HTML5上传,否则用HTML4方式上传。

纠结就这么来了:web.py只能用HTML4方式上传,而xheaditor默认又是用HTML5方式上传。只有修改xheditor.js的代码了,把this.startUpload跟HTML5上传有关的判断之类的该删除的都删除了。最后,终于成功了。

最后,因为xheaditor上传后返回的结果需要是json格式的,在python里,直接import json,然后return json.dumps({'err':'','msg':filename})就可以了:)