Чтение данных файла без сохранения его в колбе
Я пишу свое первое приложение колбы. Я имею дело с загрузкой файлов, и в основном то, что я хочу, - это прочитать данные/содержимое загруженного файла без его сохранения, а затем распечатать его на результирующей странице. Да, я предполагаю, что пользователь всегда загружает текстовый файл.
вот простая функция загрузки я использую:
@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)
прямо сейчас я сохраняю файл, но мне нужно, чтобы переменная 'a' содержала содержимое/данные файла .. любой идеи?
2 ответа:
FileStorage
содержитfile.stream.read()
. Также вы можете использовать сdst
параметр asStringIO
или другой объект ввода-вывода или файла для копированияFileStorage.stream
к другому объекту ввода-вывода или файлу.см. документацию: http://flask.pocoo.org/docs/api/#flask.Request.files и http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage.
Если вы хотите использовать стандартный материал колбы - нет никакого способа избежать сохранения временного файла, если размер загруженного файла > 500 Кб. Если он меньше 500kb-он будет использовать "BytesIO", который хранит содержимое файла в памяти, а если он больше 500kb-он хранит содержимое в TemporaryFile () (как указано в документация werkzeug). В обоих случаях ваш скрипт будет блокироваться до тех пор, пока не будет получен весь загруженный файл.
самый простой способ обойти это то, что я нашел:
1) Создайте свой собственный файловый класс ввода-вывода, где вы делаете всю обработку входящих данных
2) в вашем скрипте переопределите класс запроса своим собственным:
class MyRequest( Request ): def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ): return MyAwesomeIO( filename, 'w' )
3) Замените request_class колбы на свой собственный:
app.request_class = MyRequest
4) иди выпей пива:)