Чтение данных файла без сохранения в Flask
Я пишу свое первое фляжное приложение. Я имею дело с загрузкой файлов, и в основном я хочу читать данные/содержимое загруженного файла, не сохраняя его, а затем печатать на полученной странице. Да, я предполагаю, что пользователь всегда загружает текстовый файл.
Вот простая функция загрузки, которую я использую:
@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', которая содержит содержимое/данные файла.. любые идеи?
Ответы
Ответ 1
FileStorage
содержит поле stream
. Этот объект должен расширять IO или файл-объект, поэтому он должен содержать read
и другие подобные методы. FileStorage
также расширяют атрибуты объекта поля stream
, поэтому вы можете просто использовать file.read()
вместо file.stream.read()
. Также вы можете использовать аргумент save
с параметром dst
как StringIO
или другой объект ввода-вывода или файл для копирования FileStorage.stream
в другой объект ввода-вывода или файл.
См. документацию: http://flask.pocoo.org/docs/api/#flask.Request.files и http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage.
Ответ 2
Если вы хотите использовать стандартные материалы Flask - нет способа избежать сохранения временного файла, если размер загружаемого файла> 500 КБ. Если он меньше 500 КБ - он будет использовать "BytesIO", который хранит содержимое файла в памяти, а если он больше 500 КБ - он хранит содержимое в TemporaryFile() (как указано в документации werkzeug), В обоих случаях ваш скрипт будет блокироваться до тех пор, пока не будет получен весь загруженный файл.
Самый простой способ обойти это, что я нашел, это:
1) Создайте свой собственный файловый класс IO, где вы выполняете всю обработку входящих данных
2) В вашем скрипте переопределите класс Request своим собственным:
class MyRequest( Request ):
def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ):
return MyAwesomeIO( filename, 'w' )
3) Замените класс запроса Flask своим собственным:
app.request_class = MyRequest
4) Иди выпей пива :)
Ответ 3
В случае, если мы хотим записать файл в памяти на диск. Этот код можно использовать
if isinstanceof(obj,SpooledTemporaryFile):
obj.rollover()
Ответ 4
Я не знаю о колбе, но есть ли что-нибудь, чтобы остановить вас, используя чтение?
Предполагая, что файл хранится где-то, когда он его загружает.
f = open('user_uploaded_file.txt','r') # From wherever they upload it to.
read = f.read()