J'écris ma première application flask. Je m'occupe du téléchargement de fichiers. Ce que je veux, en gros, c'est lire les données/le contenu du fichier téléchargé sans l'enregistrer, puis l'imprimer sur le fichier résultant. Oui, je suppose que l’utilisateur télécharge toujours un fichier texte.
Voici la fonction de téléchargement simple que j'utilise:
@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 ce moment, je suis en train de sauvegarder le fichier, mais ce dont j'ai besoin, c'est que "une" variable contienne le contenu/les données du fichier ... des idées?
FileStorage
contient le champ stream
. Cet objet doit être étendu IO ou un objet fichier, il doit donc contenir read
et d'autres méthodes similaires. FileStorage
également étendre stream
attributs d'objet de champ Ainsi, vous pouvez simplement utiliser file.read()
à la place de file.stream.read()
. Vous pouvez également utiliser l'argument save
avec le paramètre dst
comme StringIO
ou autre. IO ou un objet fichier à copier FileStorage.stream
vers un autre IO ou un objet fichier.
Voir la documentation: http://flask.pocoo.org/docs/api/#flask.Request.files et http://werkzeug.pocoo.org/docs/datastructures/# werkzeug.datastructures.FileStorage .
Si vous souhaitez utiliser le contenu standard Flask - il n’est pas possible d’éviter de sauvegarder un fichier temporaire si la taille du fichier téléchargé est> 500 Ko. Si elle est inférieure à 500 Ko - elle utilisera "BytesIO", qui enregistre le contenu du fichier dans la mémoire, et s'il dépasse 500 Ko - le contenu est stocké dans TemporaryFile () (comme indiqué dans la documentation de werkzeug ). Dans les deux cas, votre script sera bloqué jusqu'à ce que l'intégralité du téléchargement soit chargée. le fichier est reçu.
Le moyen le plus simple de contourner ce problème que j'ai trouvé est le suivant:
1) Créez votre propre classe IO) semblable à un fichier où vous effectuez tout le traitement des données entrantes.
2) Dans votre script, remplacez la classe Request par la vôtre:
class MyRequest( Request ):
def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ):
return MyAwesomeIO( filename, 'w' )
3) Remplacez la classe request_class par la vôtre:
app.request_class = MyRequest
4) Allez prendre de la bière :)
Au cas où nous voudrions vider le fichier en mémoire sur le disque. Ce code peut être utilisé
if isinstanceof(obj,SpooledTemporaryFile):
obj.rollover()