簡體   English   中英

讀取文件數據而不將其保存在 Flask 中

[英]Read file data without saving it in 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”變量來包含文件的內容/數據......有什么想法嗎?

FileStorage包含stream字段。 這個對象必須擴展 IO 或文件對象,所以它必須包含read和其他類似的方法。 FileStorage還擴展了stream字段對象屬性,因此您可以使用file.read()代替file.stream.read() 您也可以使用帶有dst參數的save參數作為StringIO或其他 IO 或文件對象將FileStorage.stream復制到另一個 IO 或文件對象。

請參閱文檔: http : //flask.pocoo.org/docs/api/#flask.Request.fileshttp://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage

如果您想使用標准的 Flask 內容 - 如果上傳的文件大小 > 500kb,則無法避免保存臨時文件。 如果它小於 500kb - 它將使用“BytesIO”,它將文件內容存儲在內存中,如果它超過 500kb - 它會將內容存儲在 TemporaryFile() 中(如werkzeug 文檔中所述)。 在這兩種情況下,您的腳本都會阻塞,直到收到整個上傳的文件。

我發現解決此問題的最簡單方法是:

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' )

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

app.request_class = MyRequest

4) 去喝點啤酒 :)

我分享我的解決方案(假設一切都已配置為連接到燒瓶中的谷歌存儲桶)

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())

我的帖子

直接到 Flask 中的 Google Bucket

我試圖做完全相同的事情,打開一個文本文件(實際上是 Pandas 的 CSV)。 不想復制它,只想打開它。 form-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) 

我分享我的解決方案,使用熊貓


@app.route('/upload/', methods=['POST'])
def upload():
    if request.method == 'POST':
        # FileStorage object wrapper
        file = request.files["file"]                    
        if file:
            df = pd.read_excel(files_excel["file"])

基於@tbicr 的一個很好的答案,最簡單的形式歸結為:

for line in request.files.get('file'):
   print("Next line: " + line)

我正在編寫我的第一個燒瓶應用程序。 我正在處理文件上傳,基本上我想要的是在不保存的情況下讀取上傳文件的數據/內容,然后將其打印在結果頁面上。 是的,我假設用戶始終上傳一個文本文件。

這是我正在使用的簡單上傳功能:

@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'變量來包含文件的內容/數據..有什么想法嗎?

在功能上

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>

如果我們想將內存文件轉儲到磁盤。 可以使用此代碼

  if isinstanceof(obj,SpooledTemporaryFile):
    obj.rollover()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM