在关闭fi上使用上载的文件I/O操作重定向Flask

2024-04-19 13:05:51 发布

您现在位置:Python中文网/ 问答频道 /正文

此应用程序应允许用户上载文件,然后根据文件类型执行保存任务。如果是PDF文件,则会加载一个新的选择页面,提示用户选择文件夹。选择后,错误:值错误:关闭文件的I/O操作弹出,并在所选位置保存一个空PDF文件。在

“.mxd”文件处理没有问题。这似乎是因为我已重定向到选择模板,但我不确定如何才能使用文件夹选择。在

为了保持简单,省略了许多代码。任何帮助都将不胜感激。在

@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页:

Upload file

第2页:

enter image description here

第3页:

enter image description here


Tags: 文件selfformreturnifpdfrequestdef
1条回答
网友
1楼 · 发布于 2024-04-19 13:05:51

Flask创建一个FileStorage对象,它是传入文件的一个薄包装。在

这个对象的stream属性通常指向一个打开的临时文件(根据文档)。我猜,一旦请求被服务,这个临时文件就会被关闭,因此全局对象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")
...

在选择方法中,可以将文件从临时位置移动到所需位置。在

^{pr2}$

相关问题 更多 >