我做了如下简单的网络服务器。
import BaseHTTPServer, os, cgi
import cgitb; cgitb.enable()
html = """
<html>
<body>
<form action="" method="POST" enctype="multipart/form-data">
File upload: <input type="file" name="upfile">
<input type="submit" value="upload">
</form>
</body>
</html>
"""
class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("content-type", "text/html;charset=utf-8")
self.end_headers()
self.wfile.write(html)
def do_POST(self):
ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
if ctype == 'multipart/form-data':
query = cgi.parse_multipart(self.rfile, pdict)
upfilecontent = query.get('upfile')
if upfilecontent:
# i don't know how to get the file name.. so i named it 'tmp.dat'
fout = file(os.path.join('tmp', 'tmp.dat'), 'wb')
fout.write (upfilecontent[0])
fout.close()
self.do_GET()
if __name__ == '__main__':
server = BaseHTTPServer.HTTPServer(("127.0.0.1", 8080), Handler)
print('web server on 8080..')
server.serve_forever()
在BaseHTTPRequestHandler的dou Post方法中,我成功地获取了上传的文件数据。
但我不知道如何获得上传文件的原始名称。 self.rfile.name只是一个“套接字” 如何获取上传的文件名?
通过使用cgi.FieldStorage,您可以轻松地提取文件名。检查以下示例:
你在那里作为一个起点使用的代码相当糟糕(例如,看看那些
global rootnode
其中使用了名称rootnode
无处--显然是半编辑的源代码,而且在这方面做得很糟糕)。不管怎样,对于
POST
,您使用的“客户端”是什么表单?它如何设置upfile
字段?为什么不使用常规的
FieldStorage
方法,如Python's docs中所述?这样,您可以使用适当字段的.file
属性来获取要读取的类文件对象,或者使用其.value
属性来读取内存中的所有内容并将其作为字符串获取,再加上该字段的.filename
属性来知道上载文件的名称。关于FieldStorage
的更详细的文档(虽然简洁)是here。编辑:现在OP已经编辑了Q以澄清问题,我看到了问题:
BaseHTTPServer
没有按照CGI规范设置环境,因此cgi
模块不能很好地使用它。不幸的是,环境设置的唯一简单方法是从CGIHTTPServer.py
中窃取并破解一大块代码(不打算重用,因为需要,叹息,复制和粘贴编码),例如:这一点可以进一步简化,但也需要在这项任务上花费一些时间和精力。
有了这个
populenv
函数,我们可以重新编码:……从此过上幸福的生活;—)。(当然,使用任何像样的WSGI服务器,甚至the demo one,都会容易得多,但是这个练习对CGI及其内部是有指导意义的;-)。
…或者使用自己版本的cgi.parse_multipart,特别是修复以下问题:
相关问题 更多 >
编程相关推荐