读取文件数据而不保存在Flask中
我正在写我的第一个烧瓶应用程序。 我正在处理file upload,基本上我想要的是读取上传的文件的数据/内容而不保存,然后打印在结果页面上。 是的,我假设用户总是上传文本文件。
这里是我正在使用的简单的上传function:
@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)
现在,我正在保存文件,但是我需要的是包含文件内容/数据的“一个”variables。任何想法?
FileStorage
包含stream
场。 该对象必须扩展IO或文件对象,所以它必须包含read
和其他类似的方法。 FileStorage
还扩展了stream
场对象的属性,所以你可以使用file.read()
代替file.stream.read()
。 您也可以使用save
参数与dst
参数作为StringIO
或其他IO或文件对象将FileStorage.stream
复制到另一个IO或文件对象。
请参阅文档: http : //flask.pocoo.org/docs/api/#flask.Request.files和http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage 。
如果你想使用标准的Flask的东西 – 如果上传的文件大小> 500kb,没有办法避免保存一个临时文件。 如果小于500kb,将使用“BytesIO”,它将文件内容存储在内存中,如果大于500kb,则将其内容存储在TemporaryFile()中。 在这两种情况下,您的脚本将被阻止,直到接收到所有上传的文件。
解决这个问题的最简单的方法是:
1)创build自己的文件类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的request_class:
app.request_class = MyRequest
4)去喝点啤酒:)
我不知道烧瓶,但有什么阻止你使用阅读?
假设file upload时存储在某个地方 。
f = open('user_uploaded_file.txt','r') # From wherever they upload it to. read = f.read()