Python SimpleHTTPServer或cgi能否上传文件?

16

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

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

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


SimpleHTTPServer非常简单,以至于它不提供任何ftp(上传)支持。 - shad0w_wa1k3r
这里有另一个例子:http://fragments.turtlemeat.com/pythonwebserver.php。还有一个例子在这里:https://code.google.com/p/python-simple-fileserver/。 - Robᵩ
你能告诉我们你是如何执行代码的,当你从浏览器上传文件时输出的结果是什么吗? - Prashant Borde
2个回答

4

我对Python仍不太熟悉,尝试使用了您在帖子中添加的相同代码。唯一的问题是它只允许上传单个文件。我想一次上传多个文件。

使用仍然可用的代码(在这里找到),你可以将 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中使用 multiple 标签,将HTML表单更改为允许一次上传多个文件。

我刚刚完成了测试,它可以正常工作。

希望这很有帮助。


3

是的,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>

关于如何解析form-data中的原始数据的详细信息可以在问题的评论中发布的链接中找到。


你能贴上链接吗? - Anjana
我想我原本想写的是“作为评论发布到问题中的链接”,但我真的记不清了。 - textshell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接