2011-09-09 8 views
6

Me parece que no puede acceder al file.stream.read() después de que el archivo se haya escrito con file.save('path',filename') y viceversa.¿Cómo restablecer file.stream en el matraz/werkzeug?

Código de ejemplo (derivada del patrón de la carga de archivos):

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)      

Respuesta

6

Usted debe ser capaz de seek de nuevo al comienzo de la corriente. (Consulte los documentos de Werkzeug en werkzeug.datastructures.FileStorage). Cuando intenta leer el archivo por segunda vez, comienza leyendo desde el final del archivo.

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

Thank! Pero no funciona para mí. Todavía no obtengo resultados en bash. :( – Framester

+0

Acabas de guardar 10 horas de mi vida – JiminyCricket

+0

Esta es una buena respuesta. Aunque uno debería saber la causa raíz del problema para encontrar esta respuesta :) – marcv81