2016-08-25 139 views
1

我正在尝试编写一个简单的烧瓶程序,它将创建一个网页,在其中接收文件(通过上传),然后使用该文件的数据并显示过滤的部分它在我的网页中,我似乎无法理解如何做到这一点。读取输入文件并在烧瓶中处理它

这是我用来上传文件的代码,工作正常。

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> 
    ''' 

然后我试着写的方法打开该文件,并从中读取数据,但我想不出如何做到这一点,你可以请帮助我了解如何读取文件内容和呈现在我的网站上过滤了它的版本? 谢谢!

回答

2

你已经保存在这里

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

刚打开来读,你与任何其他文件的工作,例如:

@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))时在内存中读取的信息量。