[英]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.files和http://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())
我的帖子
我試圖做完全相同的事情,打開一個文本文件(實際上是 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.