2011-09-09 16 views
6

Mi sembra che non sia possibile accedere a file.stream.read() dopo che il file è stato scritto con file.save('path',filename') e viceversa.Come resettare il file.stream in flask/werkzeug?

codice di esempio (derivato dal modello upload file):

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)      

risposta

6

Si dovrebbe essere in grado di seek di nuovo al punto di partenza del flusso. (Vedi i documenti di Werkzeug su werkzeug.datastructures.FileStorage). Quando si tenta di leggere il file una seconda volta si inizia la lettura dalla fine del file.

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

Grazie! Ma non funziona per me. Non ottengo ancora output in bash. :( – Framester

+0

Hai appena salvato 10 ore della mia vita – JiminyCricket

+0

Questa è una buona risposta, anche se si dovrebbe conoscere la causa alla radice del problema già per trovare questa risposta :) – marcv81