web-dev-qa-db-fra.com

Lire les données du fichier sans l'enregistrer dans Flask

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?

83
user2480542

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 .

105
tbicr

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 :)

9
Dimitry Miles

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()

0
lalit