以Python+Bottle框架作为jQuery.Uploadify控件的后端

jQuery.Uploadify是个功能强大的文件上传控件,基于Flash(3.0兼容HTML5),作为前端使用是个不错的选择。

目前的前端技术中,能够实现跨域POST的成熟方案一般只有借助flash,这也是Uploadify的特点吧。

Uploadify的官方提供的是一个php的后端,后端需要做的事情相当简单,就是把POST的临时数据存放到指定路径。 有不少中文资料是把uploadify作为.net程序的上传控件,原理其实一样,所以用Python实现也是很简单的。

其实那些实现的后端(包括官方实现的php)都有安全性问题,比如限制文件类型、指定上传路径都可以在远端控制,上传个木马之类会导致服务器被入侵。当然这是因为他们提供的例子是半成品,实际使用起码应该加上session id的验证之类,因为上传时候数据是由Flash发出的,和浏览器的Session无关。

下面的Python例子中,则就如还在beta阶段的uploadify 3的开发日志讨论的,暂时忽略掉folder参数。

完整的例子代码可在我的仓库下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import bottle
bottle.debug(True)
from bottle import run, route, request, get, view, static_file, abort
import shutil
import os
 
UPLOAD_BASE = "/tmp/upload"
ALLOWED_TYPE = ("wmv","rmvb","mpeg","3gp","avi","mov","mp4","flv","mpg","vob","png","jpg")
 
@route('/upload', method='POST')
def do_upload():
    try:
        filename = request.POST.get('Filename')
        root, ext = os.path.splitext(filename)
        assert ext[1:].lower() in ALLOWED_TYPE, "Invalid file type: " + ext
        if not os.path.isdir(UPLOAD_BASE):
            os.makedirs(UPLOAD_BASE)
        filedata = request.POST.get('Filedata')
        assert filedata is not None, "Invalid Upload data."
        with open(os.path.join(UPLOAD_BASE, filename), 'wb') as f:
            shutil.copyfileobj(filedata.file, f, 8192)
    except AssertionError, e:
        abort(403, str(e))
    else:
        return filename
 
@route('/crossdomain.xml')
def crossdomain():
    return """<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
"""
 
@route('/static/:path#.+#')
def server_static(path):
    return static_file(path, root='static')
 
@route('/')
@view('upload')
def index():
    return dict()
 
run(host='0.0.0.0', port=8080)
文章分类 Python 标签: , , ,

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*