如何使用Python / CGI进行文件上传

时间:2011-02-03 19:39:22

标签: javascript python html cgi

我正在尝试创建一个文件上传页面,它会提示用户输入文件,并在显示进度时上传。

目前我已经设法创建一个可以调用我的python脚本的简单HTML页面。然后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 个答案:

答案 0 :(得分:6)

考虑到文件上传在HTTP协议中的工作方式,这比看起来更复杂。大多数Web服务器只有在上传文件完全传输后才能控制CGI脚本,因此无法同时提供反馈。

但是有些Python库试图解决这个问题。例如:gp.fileupload(适用于WSGI,而不适用于CGI)。

诀窍是提供一种方法,通过AJAX查询上传进度,同时仍然传输上传的文件。如果Web服务器(例如,Apache或nginx)未配置为支持上载进度功能,则没有用,因为您可能会在进度条中看到0%到100%的跳转。

我建议您尝试Plupload,它可以在客户端运行,并且更加简单。