Flask 重定向上传文件 - I/O 对关闭文件的操作
Flask redirect with uploaded file - I/O operation on closed file
此应用应允许用户上传文件,然后根据文件类型执行保存任务。如果是 PDF 文件,则会加载一个新的 selection 页面,提示用户 select 一个文件夹。一旦 selected 错误:ValueError: I/O operation on closed file 弹出并保存一个 empty PDF file在 selected 位置。
".mxd" 文件处理没有问题。这似乎是因为我已重定向到 selection 模板,但我不确定我还能如何使用文件夹 selection.
为了简单起见,省略了很多代码。任何帮助将不胜感激。
@app.route("/", methods=['GET', 'POST'])
def upload_file():
form = ReusableForm(request.form) # calls on form
if request.method == 'POST':
global folderout
folderout = request.form['folderout']
global file
file = request.files['file']
if filename.endswith((".pdf")): # For PDF files only
return redirect("/selection")
return redirect("/editor")
if filename.endswith((".mxd")):
MXDfull.savemxd()
MXDfull.pdf()
MXDfull.thumb()
return redirect("/editor")
@app.route("/selection", methods=['GET', 'POST'])
def selection1():
form = SelectionForm(request.form)
if request.method == 'POST':
global selection
selection = request.form['selection']
pdffilesave.savepdf()
return render_template("selection.html", form=form)
class PDFFile:
def savepdf(self):
self.pdffolder = os.path.join(folderout,selection)
self.pdffilename = "K" + Fnum + ".pdf"
file.save(os.path.join(self.pdffolder, self.pdffilename))
return
pdffilesave = PDFFile()
第 1 页:
第 2 页:
第 3 页:
Flask 创建一个 FileStorage 对象,它是对传入文件的精简包装。
这个对象的流属性通常指向一个打开的临时文件(根据文档)。我猜一旦请求被送达,这个临时文件就会关闭,因此从你的全局对象 file
到这个流的引用指向一个关闭的文件。你一定遇到了这个错误
ValueError: I/O operation on closed file.
一种解决方法是将文件保存在 upload_file
方法中的临时位置,并将该文件的位置存储在全局变量 filename
.
中
@app.route("/", methods=['GET', 'POST'])
def upload_file():
....
file = request.files['file']
global file_name = '/tmp/' + file.filename
file.save(file_name)
if file.filename.endswith((".pdf")): # For PDF files only
return redirect("/selection")
return redirect("/editor")
...
在选择方法中,您可以将文件从临时位置移动到所需位置。
@app.route("/selection", methods=['GET', 'POST'])
def selection1():
....
os.rename(file_name, dest_file_name)
...
此应用应允许用户上传文件,然后根据文件类型执行保存任务。如果是 PDF 文件,则会加载一个新的 selection 页面,提示用户 select 一个文件夹。一旦 selected 错误:ValueError: I/O operation on closed file 弹出并保存一个 empty PDF file在 selected 位置。
".mxd" 文件处理没有问题。这似乎是因为我已重定向到 selection 模板,但我不确定我还能如何使用文件夹 selection.
为了简单起见,省略了很多代码。任何帮助将不胜感激。
@app.route("/", methods=['GET', 'POST'])
def upload_file():
form = ReusableForm(request.form) # calls on form
if request.method == 'POST':
global folderout
folderout = request.form['folderout']
global file
file = request.files['file']
if filename.endswith((".pdf")): # For PDF files only
return redirect("/selection")
return redirect("/editor")
if filename.endswith((".mxd")):
MXDfull.savemxd()
MXDfull.pdf()
MXDfull.thumb()
return redirect("/editor")
@app.route("/selection", methods=['GET', 'POST'])
def selection1():
form = SelectionForm(request.form)
if request.method == 'POST':
global selection
selection = request.form['selection']
pdffilesave.savepdf()
return render_template("selection.html", form=form)
class PDFFile:
def savepdf(self):
self.pdffolder = os.path.join(folderout,selection)
self.pdffilename = "K" + Fnum + ".pdf"
file.save(os.path.join(self.pdffolder, self.pdffilename))
return
pdffilesave = PDFFile()
第 1 页:
第 2 页:
第 3 页:
Flask 创建一个 FileStorage 对象,它是对传入文件的精简包装。
这个对象的流属性通常指向一个打开的临时文件(根据文档)。我猜一旦请求被送达,这个临时文件就会关闭,因此从你的全局对象 file
到这个流的引用指向一个关闭的文件。你一定遇到了这个错误
ValueError: I/O operation on closed file.
一种解决方法是将文件保存在 upload_file
方法中的临时位置,并将该文件的位置存储在全局变量 filename
.
@app.route("/", methods=['GET', 'POST'])
def upload_file():
....
file = request.files['file']
global file_name = '/tmp/' + file.filename
file.save(file_name)
if file.filename.endswith((".pdf")): # For PDF files only
return redirect("/selection")
return redirect("/editor")
...
在选择方法中,您可以将文件从临时位置移动到所需位置。
@app.route("/selection", methods=['GET', 'POST'])
def selection1():
....
os.rename(file_name, dest_file_name)
...