Lee los datos del archivo sin guardarlo en Flask

Estoy escribiendo mi primera aplicación matraz. Estoy tratando con las cargas de archivos, y básicamente lo que quiero es leer los datos / contenido del archivo cargado sin guardarlos y luego imprimirlos en la página resultante. Sí, asumo que el usuario carga un archivo de texto siempre.

Aquí está la función de carga simple que estoy usando:

@app.route('/upload/', methods=['GET', 'POST']) def upload(): if request.method == 'POST': file = request.files['file'] if file: filename = secure_filename(file.filename) file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) a = 'file uploaded' return render_template('upload.html', data = a) 

En este momento, estoy guardando el archivo, pero lo que necesito es esa variable ‘a’ para contener el contenido / los datos del archivo … ¿alguna idea?

FileStorage contiene un campo FileStorage . Este objeto debe extender IO u objeto de archivo, por lo que debe contener read y otros métodos similares. FileStorage también extiende los atributos del objeto de campo de la stream , por lo que puede usar file.read() lugar de file.stream.read() . También puede usar save argumento con el parámetro dst como StringIO u otro objeto IO o archivo para copiar FileStorage.stream a otro objeto IO o archivo.

Consulte la documentación: http://flask.pocoo.org/docs/api/#flask.Request.files y http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage .

Si desea utilizar material estándar de Flask, no hay forma de evitar guardar un archivo temporal si el tamaño del archivo cargado es> 500kb. Si es más pequeño que 500kb, usará “BytesIO”, que almacena el contenido del archivo en la memoria, y si es más de 500kb, almacenará el contenido en TemporaryFile () (como se indica en la documentación de werkzeug ). En ambos casos, su secuencia de comandos se bloqueará hasta que se reciba la totalidad del archivo cargado.

La forma más fácil de solucionar este problema que he encontrado es:

1) Cree su propia clase de E / S similar a un archivo en el que realice todo el procesamiento de los datos entrantes

2) En su script, anule la clase Request con la suya:

 class MyRequest( Request ): def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ): return MyAwesomeIO( filename, 'w' ) 

3) Reemplace request_class de Flask con su propio:

 app.request_class = MyRequest 

4) Ve a tomarte una cerveza 🙂