可以使用Python SimpleHTTPServer或cgi上传文件吗?

时间:2013-12-06 16:11:45

标签: python file-upload webserver cgi simplehttpserver

我想有一个简单的网页,用户可以在其上传文件。什么是最简单的方法。

我知道如何启动SimpleHTTPServer,但我不知道如何使用SimpleHTTPServer上传文件。我甚至不知道是否有可能。

我找到了一些使用cgi上传文件的代码,但如果我在命令行中执行此代码,它只会在屏幕上打印HTML代码。

2 个答案:

答案 0 :(得分:3)

我还是Python的新手,并尝试使用您添加到帖子中的相同代码。唯一的问题是它只允许单个文件上传。 我想一次上传多个文件。

使用找到的here仍然可用的代码,您可以使用以下代码替换deal_post_data方法:

    form = cgi.FieldStorage(
    fp=self.rfile,
    headers=self.headers,
    environ={'REQUEST_METHOD':'POST'})

    self.send_response(200)
    self.end_headers()

    saved_fns = ""

    try:
        if isinstance(form['file'], list):
            for f in form['file']:
                print f.filename
                saved_fns = saved_fns + ", " + f.filename
                self.save_file(f)
                self.wfile.write(f.value)
        else:
            f = form['file']
            self.save_file(f)
            saved_fns = saved_fns + f.filename
            self.wfile.write(f.value)
        return (True, "File(s) '%s' upload success!" % saved_fns)
    except IOError:
        return (False, "Can't create file to write, do you have permission to write?")

然后添加以下功能以保存上传的文件:

def save_file(self, file):
    outpath = os.path.join("", file.filename)
    with open(outpath, 'wb') as fout:
        shutil.copyfileobj(file.file, fout, 100000)

最后,更改html表单以允许使用插入的HTML中的multiple标记一次上传多个文件。

我刚刚完成测试,它运行正常。

希望它有用

答案 1 :(得分:1)

是的,SimpleHTTPServer可以使用正确的请求处理程序接收http上传。

基本上,您需要定义一个do_POST方法,其中表单或类似内容上传数据。然后可以从self.rfile中读取上传内容。

class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
     # ...
     def do_POST(self):
         for line in self.rfile:
             # do something with the line
             print line

当然,如果你想从浏览器上传,你需要在某个地方发布一个发布到http服务器的表单:

<form enctype="multipart/form-data" method="post" action="http://hostname.of.server:8080/">
  <input name="file" type="file"/>
  <input type="submit" value="upload"/>
</form>

更多详细信息,特别是如何从表单数据中解析原始数据,可以在作为问题评论发布的链接中找到。