如何验证使用Python CGI从POST完全上传的文件?

时间:2019-04-10 07:46:40

标签: python python-3.x http-post cgi

我们如何验证文件已通过上传完全下载到服务器?在Python CGI documentation for 3.7上,它指出如果发生错误(例如上载被中断或取消),则done属性将设置为-1。我对于在尝试将其作为LARGEBLOB存储在网站MySQL数据库中之前如何确保已下载整个文件感到困惑。

如何在确保done不为-1(上传中断或无法完成)的同时验证文件已完全上传?

我认为它与done属性有关,因此得名,但是如何让Python等到文件上传完成呢?关于我的python版本的CGI的文档并未真正扩展done的行为。

我认为所有POST数据都将在执行python脚本之前上传。但是对于文件上传,我不知道是不是这种情况。

这些文件的大小可能接近2 GB,因此我想花最少的时间在服务器端处理它们,并避免CPU密集型处理。

文档指出:

  

如果字段表示上传的文件,则通过value属性或getvalue()方法访问该值将读取内存中的整个文件(以字节为单位)。这可能不是您想要的。您可以通过测试文件名属性或文件属性来测试上传的文件。然后,您可以从file属性读取数据,然后将其自动关闭,作为FieldStorage实例的垃圾回收的一部分(read()和readline()方法将返回字节)

所以,如果我这样做了:

...

fileitem = form['myfile']
if fileitem.file:
    print("<p> The file has been uploaded completely and successfully </p>")
else:
    print("<p> The file wasn't uploaded successfully</p>")

...

但是如果我可以测试done属性,那么file属性会出现在图片的什么位置?

在文档中,他们执行以下代码:

fileitem = form["userfile"]
if fileitem.file:
    # It's an uploaded file; count lines
    linecount = 0
    while True:
        line = fileitem.file.readline()
        if not line: break
        linecount = linecount + 1

为什么逐行读取文件?就我而言,我不想将POST中的文件数据写入服务器上的文件中,而是直接将其从内存中写入数据库中。

如果我刚做过fileitem.file.read()fileitem.file is True,那么如果done属性为{{1},我什至需要检查-1是否为file }说明如何测试上传的文件?

换句话说,如果用户取消了上传,True会不会只是fileitem.fileFalse不会完全多余吗?

0 个答案:

没有答案