2011-09-09 9 views
6

ファイルがfile.save('path',filename')で書かれた後にfile.stream.read()にアクセスすることはできません。その逆もあります。 (ファイルのアップロードパターン由来)flask/werkzeugのfile.streamをリセットするにはどうすればいいですか?

例のコードは:

import os 
from flask import Flask, request, redirect, url_for, send_from_directory 
from werkzeug import secure_filename 

UPLOAD_FOLDER = 'uploads/' 
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) 

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': 
     file = request.files['file'] 
     if file and allowed_file(file.filename): 
      filename = secure_filename(file.filename) 
      print '##########################' 
      print os.path.join(app.config['UPLOAD_FOLDER'],filename) 
      file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
      print file.stream.read() # <- gives no output 
      print '##########################' 
      return redirect(url_for('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> 
    ''' 

@app.route('/uploads/<filename>') 
def uploaded_file(filename): 
    return send_from_directory(app.config['UPLOAD_FOLDER'], 
           filename) 

if __name__ == '__main__': 
    app.run(debug=True)      

答えて

6

あなたはバックストリームの開始にseekにできるはずです。 (Werkzeugの文書werkzeug.datastructures.FileStorageを参照してください)。ファイルをもう一度読み込もうとすると、ファイル末尾からが始まり、が読み込まれます。

file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
file.stream.seek(0) # Go back to the start of the file 
print file.stream.read() # <- should work now. 
+0

ありがとうございます。しかし、私のために働いていません。私はまだbashで出力がありません。 :( – Framester

+0

あなたは私の人生の10時間を保存しました。 – JiminyCricket

+0

これは良い答えです。この回答を見つけるためには、すでに問題の根本的な原因を知っていなければなりません:) – marcv81