2017-07-10 19 views
0
import os 
from flask import Flask, request, redirect, url_for 
from werkzeug import secure_filename 

UPLOAD_FOLDER = '/home/ubuntu/shared/' 

app = Flask(__name__) 
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 

@app.route("/", methods=['GET', 'POST']) 
def index(): 
    if request.method == 'POST': 
     file = request.files['file'] 
     if file: 
      filename = secure_filename(file.filename) 
      file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
      return redirect(url_for('index')) 
    return """ 
    <!doctype html> 
    <title>Upload new File</title> 
    <h1>Upload new File</h1> 
    <form action="" method="post" enctype="multipart/form-data"> 
     <p><input type="file" multiple="" name="file"> 
     <input type="submit" value="Upload"> 
    </form> 
    <p>%s</p> 
    """ % "<br>".join(os.listdir(app.config['UPLOAD_FOLDER'],)) 

if __name__ == "__main__": 
    app.run(host='0.0.0.0', port=8000, debug=False) 

サーバーを起動してフォームから2つのファイルを選択すると、そのうちの1つのみがアップロードされます。私はサーバーの時間を試して、ドキュメンテーションを含めて約15のトピックを読んだ。 灘:Flask HTTP Serverは一度に複数のファイルをアップロードすることを許可しません

編集C: 私も変えてみました:

 file = request.files['file'] 

へ:

 file = request.files.getlist('file') 

はどちらか動作しません。引用符のタイプは効果がありません。それはpython3のことではありませんか?

+0

私が気付いたことは、あなたが二重引用符を囲むのにdocstringを使用していることです。代わりに一重引用符を使用してください。三重引用符はPythonの特別な目的を持っています。 – Peri461

答えて

0
import os, ssl 
from flask import Flask, request, redirect, url_for 
from werkzeug import secure_filename 

UPLOAD_FOLDER = '/home/ubuntu/shared/' 
certfile = "/home/ubuntu/keys/fullchain.pem" 
keyfile = "/home/ubuntu/keys/privkey.pem" 
ecdh_curve = "secp384r1" 
cipherlist = "ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-ECDSA-CHACHA20-POLY1305" 

sslcontext = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH) 
sslcontext.options |= ssl.OP_NO_TLSv1 
sslcontext.options |= ssl.OP_NO_TLSv1_1 
sslcontext.protocol = ssl.PROTOCOL_TLSv1_2 
sslcontext.set_ciphers(cipherlist) 
sslcontext.set_ecdh_curve(ecdh_curve) 
sslcontext.load_cert_chain(certfile, keyfile) 

app = Flask(__name__) 
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 

@app.route("/", methods=['GET', 'POST']) 
def index(): 
    if request.method == 'POST': 
     my_data = request.files.getlist('file') 
     my_pass = request.form['password'] 
     if my_data and my_pass == 'yakumo': 
      for file in my_data: 
       my_handler(file) 
      return redirect(url_for('index')) 
    return """ 
    <!doctype html> 
    <title>Upload new File</title> 
    <h1>Upload new File</h1> 
    <form action="" method=post enctype=multipart/form-data> 
    <p><input type=file multiple name=file> 
     <input type="password" name="password" value=""> 
     <input type=submit value=Upload> 
    </form> 
    <p>%s</p> 
    """ % "<br>".join(os.listdir(app.config['UPLOAD_FOLDER'],)) 

def my_handler(f): 
    filename = secure_filename(f.filename) 
    f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 

if __name__ == "__main__": 
    app.run(host='0.0.0.0', port=8000, ssl_context=sslcontext, threaded=True, debug=False) 

私は非常にルーキーなミスを犯し、アップロードされる複数のファイルに対してfor-loopを実行しませんでした。ここのコードは、4つの同時ファイルアップロードで問題なくテストされました。私はそれが誰かに役立つことを願っています。

編集:コードがいくつかの甘いTLS_1.2とパスワードフィールドで更新されました。合理的に安全なアップロードサーバーをお楽しみください。パスワードはHTTPS経由で転送されます。

関連する問題