Python 读取文件数据而不将其保存在烧瓶中

Python 读取文件数据而不将其保存在烧瓶中,python,flask,Python,Flask,我正在写我的第一份申请书。我处理的是文件上传,基本上我想要的是读取上传文件的数据/内容,而不保存它,然后在生成的页面上打印它。是的,我假设用户总是上传一个文本文件 下面是我正在使用的简单上传功能: @app.route('/upload/', methods=['GET', 'POST']) def upload(): if request.method == 'POST': file = request.files['file'] if file:

我正在写我的第一份申请书。我处理的是文件上传,基本上我想要的是读取上传文件的数据/内容,而不保存它,然后在生成的页面上打印它。是的,我假设用户总是上传一个文本文件

下面是我正在使用的简单上传功能:

@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”变量来包含文件的内容/数据。。有什么想法吗?

文件存储
包含
字段。此对象必须扩展IO或文件对象,因此必须包含
read
和其他类似方法
FileStorage
还扩展了
stream
字段对象属性,因此您可以只使用
file.read()
而不是
file.stream.read()
。您还可以使用
save
参数和
dst
参数作为
StringIO
或其他IO或文件对象,将
FileStorage.stream
复制到另一个IO或文件对象


请参阅文档:和。

如果您想使用标准烧瓶材料-如果上载的文件大小大于500kb,则无法避免保存临时文件。如果小于500kb,则使用“BytesIO”,将文件内容存储在内存中;如果大于500kb,则将内容存储在临时文件()中(如中所述)。在这两种情况下,您的脚本都将被阻止,直到收到全部上载的文件

我发现最简单的解决方法是:

1) 创建自己的文件,如IO类,在该类中处理传入数据

2) 在脚本中,使用自己的类覆盖请求类:

class MyRequest( Request ):
  def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ):
    return MyAwesomeIO( filename, 'w' )
app.request_class = MyRequest
3) 将Flask的request_类替换为您自己的:

class MyRequest( Request ):
  def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ):
    return MyAwesomeIO( filename, 'w' )
app.request_class = MyRequest

4) 去喝点啤酒:)

以防我们想把内存中的文件转储到磁盘上。可以使用此代码

如果isinstanceof(obj,SpooledTemporaryFile):
对象滚动()
在函数中

def handleUpload():
    if 'photo' in request.files:
        photo = request.files['photo']
        if photo.filename != '':      
            image = request.files['photo']  
            image_string = base64.b64encode(image.read())
            image_string = image_string.decode('utf-8')
            #use this to remove b'...' to get raw string
            return render_template('handleUpload.html',filestring = image_string)
    return render_template('upload.html')
在html文件中

<html>
<head>
    <title>Simple file upload using Python Flask</title>
</head>
<body>
    {% if filestring %}
      <h1>Raw image:</h1>
      <h1>{{filestring}}</h1>
      <img src="data:image/png;base64, {{filestring}}" alt="alternate" />.
    {% else %}
      <h1></h1>
    {% endif %}
</body>

使用Python Flask进行简单的文件上传
{%if filestring%}
原始图像:
{{filestring}}
.
{%else%}
{%endif%}

我正试图做同样的事情,打开一个文本文件(实际上是熊猫的CSV)。不想复制它,只想打开它。表单WTF有一个很好的文件浏览器,但是它会打开文件并生成一个临时文件,该文件以内存流的形式呈现。在引擎盖下做一点工作

form = UploadForm() 
 if form.validate_on_submit(): 
      filename = secure_filename(form.fileContents.data.filename)  
      filestream =  form.fileContents.data 
      filestream.seek(0)
      ef = pd.read_csv( filestream  )
      sr = pd.DataFrame(ef)  
      return render_template('dataframe.html',tables=[sr.to_html(justify='center, classes='table table-bordered table-hover')],titles = [filename], form=form) 
我分享我的解决方案(假设所有东西都已配置为连接到flask中的google bucket)

从google.cloud导入存储
@app.route('/upload/',方法=['POST'])
def upload():
如果request.method==“POST”:
#文件存储对象包装器
file=request.files[“file”]
如果文件:
os.environ[“谷歌应用程序凭据”]=app.config[“谷歌应用程序凭据”]
bucket\u name=“bucket\u name”
storage\u client=storage.client()
bucket=存储\客户端.bucket(bucket\名称)
#将文件上载到Google Bucket
blob=bucket.blob(file.filename)
blob.upload\u from\u string(file.read())
我的职位


快速示例:
file=request.files.get('file')
filetype=magic.from_buffer(file.read(1024))
hi@user2480542。我遇到了同样的问题。你能描述一下你是如何阅读客户端上传文件的内容的吗?我正在调用file.read(),但没有得到任何信息。谢谢@tmthyjames
f=request.files['file']
将上传的文件(在请求中)放入var(“f”)。然后
f.read()
然后使用上述代码工作。当打印f.read()时,我在终端中看到了外观正确的垃圾。希望这会有帮助。如果你正在上传一个文件,并且有一个二进制流,你可以通过将它包装在TextIOWrapper中轻松地将其转换为文本流:
mystring=TextIOWrapper(binary\u stream)
f.read()
也没有给我任何东西。首先调用f.seek(0)对我来说是个好办法。