2016-08-25 13 views
1

私は、ファイルを受け取る(アップロードする)Webページを作成し、そのファイルのデータを使用してフィルタリングされた部分を表示する単純なフラスコプログラムを作成しようとしていますそれは私のウェブページでは、私はちょうどそれを行う方法を理解するようです。入力ファイルを読み込んでフラスコで処理する

これはファイルをアップロードするために使用したコードです。うまくいきました。

import os 
from flask import Flask, request, redirect, url_for 
from werkzeug.utils import secure_filename 

UPLOAD_FOLDER = 'C:/Users/ohadt/PycharmProjects/logFiles' 
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'log']) 

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

def allowed_file(filename): 
    return '.' in filename and \ 
      filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS 

@app.route('/', methods=['GET', 'POST']) 
def upload_file(): 
    if request.method == 'POST': 
     # check if the post request has the file part 
     if 'file' not in request.files: 
      flash('No file part') 
      return redirect(request.url) 
     file = request.files['file'] 
     # if user does not select file, browser also 
     # submit a empty part without filename 
     if file.filename == '': 
      flash('No selected file') 
      return redirect(request.url) 
     if file and allowed_file(file.filename): 
      filename = secure_filename(file.filename) 
      file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
      return redirect(url_for('read_uploaded_file', 
            filename=filename)) 
    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 name=file> 
     <input type=submit value=Upload> 
    </form> 
    ''' 

は、それから私は、ファイルを開いて、そこからデータを読み取るための方法を書いてみましたが、私はそれを行う方法を見つけ出すことができなかった、あなたは私がファイルの内容を読み取る方法を理解する助けと提示してください可能性私のサイトでそれをフィルタリングしたバージョン? ありがとう!

あなたはすでにあなたが他のファイル、例で作業としてちょうどそれを開いて読んでここに

file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 

それを保存

答えて

2

@app.route('/read_file', methods=['GET']) 
def read_uploaded_file(): 
    filename = secure_filename(request.args.get('filename')) 
    try: 
     if filename and allowed_filename(filename): 
      with open(os.path.join(app.config['UPLOAD_FOLDER'], filename)) as f: 
       return f.read() 
    except IOError: 
     pass 
    return "Unable to read file" 

あなたは慎重にここにユーザー入力をサニタイズする必要があり、そうでない方法意図しないもの(例えば、アプリのソースコードのようなもの)を読むのに使うことができます。

filename = secure_filename(file.filename) 
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) 
file.save(filepath) 
token = store_in_db(filepath) 
return redirect(url_for('read_uploaded_file', 
            token=token)) 

が次にトークンを受け入れ、ないファイル名:ファイルを保存するときに、例えばそれは、いくつかのトークンを使用して、データベース内のパスのストアとユーザーにだけ、このトークンを与える - ベストはちょうど任意のファイルを読み取るために、ユーザの能力を付与されていませんあなたは、ファイル読み込み時に:

@app.route('/read_file', methods=['GET']) 
def read_uploaded_file(): 
    filepath = get_filepath(request.args.get('token')) 
    try: 
     if filepath and allowed_filepath(filepath): 
      with open(filepath) as f: 
       return f.read() 
    except IOError: 
     pass 
    return "Unable to read file" 

をトークンは、ランダム長く、推測ではない(例えばuuid4)する必要が - そう簡単に他のユーザーのファイルを読み込む可能性があるでしょう。または、ファイルとユーザーの関係をデータベースに保存してチェックする必要があります。最後に、ユーザーが巨大なファイル(app.config['MAX_CONTENT_LENGTH'])をアップロードしたり、 "フィルタされた"ファイルコンテンツ(f.read(max_allowed_size))を表示したときに読み取った情報の量を制御しないように、ファイルアップロードのサイズを制御する必要があります。

関連する問題