web-dev-qa-db-ja.com

Python SimpleHTTPServerまたはcgiを使用してファイルをアップロードできますか?

ユーザーがファイルをアップロードできる簡単なWebページが欲しいのですが。それを行う最も簡単な方法は何でしょうか。

SimpleHTTPServerを開始する方法は知っていますが、SimpleHTTPServerを使用してファイルをアップロードする方法がわかりません。それが可能かどうかさえわかりません。

Cgiを使用してファイルをアップロードするためのコードをいくつか見つけましたが、コマンドラインでこのコードを実行すると、画面にHTMLコードが出力されます。

11
Roman

私はまだ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
C MaCleif

はい、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>

フォームデータから生データを解析する方法の詳細は、質問へのコメントとして投稿されたリンクにあります。

1
textshell