如何使用Python/CGI进行文件上传
我正在尝试制作一个文件上传页面,这个页面会提示用户选择一个文件,并在上传时显示进度。
目前我已经做了一个简单的HTML页面,可以调用我的Python脚本。这个Python脚本会获取文件,并分成1000字节一块一块地上传。
我遇到了两个主要问题(主要是因为我对这些完全不熟悉):
1) 我无法获取文件大小来计算上传进度的百分比。
2) 我不知道如何在服务器端的Python和页面上的内容之间进行沟通,以更新进度状态;我想这可能需要用到JavaScript。
我是不是走错了方向?或者说我的问题有没有解决办法?
这是我的Python代码:
#!/usr/local/bin/python2.5
import cgi, os
import cgitb; cgitb.enable()
try:
import msvcrt
msvcrt.setmode (0, os.O_BINARY)
msvcrt.setmode (1, os.O_BINARY)
except ImportError:
pass
form = cgi.FieldStorage()
upload = form['file']
if upload.filename:
name = os.path.basename(upload.filename)
out = open('/home/oetzi/webapps/py/' + name, 'wb', 1000)
message = "The file '" + name + "' was uploaded successfully"
while True:
packet = upload.file.read(1000)
if not packet:
break
out.write(packet)
out.close()
else:
message = "Derp... could you try that again please?"
print """\
Content-Type: text/html\n
<html><body>
<p>%s</p>
</body></html>
""" % (message,)
1 个回答
7
这件事情比看起来要复杂,因为文件上传在HTTP协议中是有特定规则的。大多数网络服务器在文件完全上传完成之前,不会把控制权交给CGI脚本,所以在这个过程中是无法给用户反馈的。
不过,有一些Python库试图解决这个问题。例如:gp.fileupload(这个是和WSGI一起用的,不是CGI)。
关键在于提供一种方法,通过AJAX查询上传进度,同时继续上传文件。如果你的网络服务器(比如Apache或nginx)没有配置好支持上传进度的功能,那么你可能会在进度条上看到从0%直接跳到100%的情况,这样就没什么用处了。
我建议你试试Plupload,这个是在客户端运行的,使用起来简单很多。