读取文件数据而不将其保存在Flask中

use*_*542 89 python 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)
Run Code Online (Sandbox Code Playgroud)

现在,我正在保存文件,但我需要的是'a'变量来包含文件的内容/数据..任何想法?

tbi*_*icr 112

FileStorage包含stream字段.此对象必须扩展IO或文件对象,因此它必须包含read和其他类似的方法.FileStorage还扩展stream字段对象的属性,所以你可以只使用file.read()代替file.stream.read().您还可以将savedst参数的参数StringIO或其他IO或文件对象用于复制FileStorage.stream到另一个IO或文件对象.

请参阅文档:http://flask.pocoo.org/docs/api/#flask.Request.fileshttp://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage.

  • 嗨@ user2480542.我遇到了同样的问题.您能描述一下如何阅读客户端上传文件的内容吗?我正在调用file.read()但是没有得到任何东西.谢谢! (6认同)
  • 如果要上传文件并使用二进制流,则可以通过将其包装在TextIOWrapper中来轻松将其转换为文本流:`mystring = TextIOWrapper(binary_stream)` (6认同)
  • `f.read()`也没有给我任何东西.首先调用`f.seek(0)`为我做了诀窍. (4认同)
  • 快速示例:`file = request.files.get('file')``filetype = magic.from_buffer(file.read(1024))` (2认同)

小智 8

如果你想使用标准的Flask东西 - 如果上传的文件大小> 500kb,就无法避免保存临时文件.如果它小于500kb - 它将使用"BytesIO",它将文件内容存储在内存中,如果它超过500kb - 它将内容存储在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' )
Run Code Online (Sandbox Code Playgroud)

3)用你自己的:替换Flask的request_class:

app.request_class = MyRequest
Run Code Online (Sandbox Code Playgroud)

4)去喝点啤酒:)


jam*_*lis 7

我分享我的解决方案(假设所有内容都已配置为连接到烧瓶中的谷歌存储桶)

from google.cloud import storage

@app.route('/upload/', methods=['POST'])
def upload():
    if request.method == 'POST':
        # FileStorage object wrapper
        file = request.files["file"]                    
        if file:
            os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = app.config['GOOGLE_APPLICATION_CREDENTIALS']
            bucket_name = "bucket_name" 
            storage_client = storage.Client()
            bucket = storage_client.bucket(bucket_name)
            # Upload file to Google Bucket
            blob = bucket.blob(file.filename) 
            blob.upload_from_string(file.read())
Run Code Online (Sandbox Code Playgroud)

我的帖子

直接到烧瓶中的 Google Bucket