2011-09-09 3 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