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

6 投票
1 回答
11020 浏览
提问于 2025-04-16 11:10

我正在尝试制作一个文件上传页面,这个页面会提示用户选择一个文件,并在上传时显示进度。

目前我已经做了一个简单的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,这个是在客户端运行的,使用起来简单很多。

撰写回答