使用 send_from_directory 和文件名从服务器位置下载文件
Download file from server location, using send_from_directory and filename
我正在努力理解如何将上传的文件名传递给 flask 中的下一个@app.route 以检索保存在服务器上的文件。
我已经能够创建一个表单来像这样将文件上传到服务器,并且能够将文件数据和文件名呈现到后续视图中。
@app.route('/file_upload', methods=['GET', 'POST'])
def upload():
form = UploadForm()
if form.validate_on_submit():
f=form.file.data
filename = secure_filename(f.filename)
file_path = os.path.join(UPLOAD_FOLDER, filename)
f.save(file_path)
Input_data_dataframe = pd.read_excel(f)
return render_template('Set_parameters.html',filename=filename,tables=[Input_data_dataframe.to_html(classes=["table table-dark table-hover"], header="true", index=False,)])
return render_template('file_upload.html',form=form)
文件成功保存在所需的服务器目的地,文件名也在下一个视图中呈现如下:
我现在希望从服务器位置检索此文件以进行进一步处理。我知道我可以使用 send_from_directory() 函数来检索文件,但是我不确定如何使用之前 @app.route('/file_upload 中的正确文件名来实现它')
@app.route('/Set_Parameters/', methods=['GET', 'POST'])
def processing(filename):
retrievedfile= send_from_directory(app.config['UPLOAD_FOLDER'],filename=filename, as_attachment=False)
Input_data_dataframe = pd.read_excel(retrievedfile) #converts uploaded file to a dataframe astype(int)
if request.method == 'POST':
Input_value1= request.form.get['Input_value1'] #get html form data value
Input_value= request.form.get['Input_value2'] #get html form data value
return render_template('Results.html',Input_value1=Input_value1, Input_value2=Input_value2, tables=[Input_data_dataframe.to_html(classes=["table table-dark table-hover"], header="true", index=False,)])
return render_template('Set_parameters.html')
目前,如果我按原样 运行,我会得到这个错误
TypeError: processing() missing 1 required positional argument: 'filename' 据我所知,我还没有将文件名传递给函数。我只是不确定该怎么做无需将文件名硬编码到代码中,然后使用相同的文件进行进一步处理。
如有任何帮助,我们将不胜感激。
您的 processing
函数需要来自 URL 的 filename
参数。你可以在这里看到它应该如何完成:https://flask.palletsprojects.com/en/1.1.x/quickstart/#variable-rules.
到此视图的路线应为:/Set_Parameters/<filename>/
。这意味着 from 的 action
属性应该是,例如:action="/Set_Parameters/This_is_the_file.xlsx"
。
如果你在 flask 中渲染那个表单,使用 flask 模板,如果你在渲染上下文中有一个文件名应该很容易:
<form action="/Set_Parameters/{{ filename }}">
...
</form>
我正在努力理解如何将上传的文件名传递给 flask 中的下一个@app.route 以检索保存在服务器上的文件。
我已经能够创建一个表单来像这样将文件上传到服务器,并且能够将文件数据和文件名呈现到后续视图中。
@app.route('/file_upload', methods=['GET', 'POST'])
def upload():
form = UploadForm()
if form.validate_on_submit():
f=form.file.data
filename = secure_filename(f.filename)
file_path = os.path.join(UPLOAD_FOLDER, filename)
f.save(file_path)
Input_data_dataframe = pd.read_excel(f)
return render_template('Set_parameters.html',filename=filename,tables=[Input_data_dataframe.to_html(classes=["table table-dark table-hover"], header="true", index=False,)])
return render_template('file_upload.html',form=form)
文件成功保存在所需的服务器目的地,文件名也在下一个视图中呈现如下:
我现在希望从服务器位置检索此文件以进行进一步处理。我知道我可以使用 send_from_directory() 函数来检索文件,但是我不确定如何使用之前 @app.route('/file_upload 中的正确文件名来实现它')
@app.route('/Set_Parameters/', methods=['GET', 'POST'])
def processing(filename):
retrievedfile= send_from_directory(app.config['UPLOAD_FOLDER'],filename=filename, as_attachment=False)
Input_data_dataframe = pd.read_excel(retrievedfile) #converts uploaded file to a dataframe astype(int)
if request.method == 'POST':
Input_value1= request.form.get['Input_value1'] #get html form data value
Input_value= request.form.get['Input_value2'] #get html form data value
return render_template('Results.html',Input_value1=Input_value1, Input_value2=Input_value2, tables=[Input_data_dataframe.to_html(classes=["table table-dark table-hover"], header="true", index=False,)])
return render_template('Set_parameters.html')
目前,如果我按原样 运行,我会得到这个错误 TypeError: processing() missing 1 required positional argument: 'filename' 据我所知,我还没有将文件名传递给函数。我只是不确定该怎么做无需将文件名硬编码到代码中,然后使用相同的文件进行进一步处理。
如有任何帮助,我们将不胜感激。
您的 processing
函数需要来自 URL 的 filename
参数。你可以在这里看到它应该如何完成:https://flask.palletsprojects.com/en/1.1.x/quickstart/#variable-rules.
到此视图的路线应为:/Set_Parameters/<filename>/
。这意味着 from 的 action
属性应该是,例如:action="/Set_Parameters/This_is_the_file.xlsx"
。
如果你在 flask 中渲染那个表单,使用 flask 模板,如果你在渲染上下文中有一个文件名应该很容易:
<form action="/Set_Parameters/{{ filename }}">
...
</form>