【问题标题】:Flask redirect with uploaded file - I/O operation on closed fileFlask 重定向与上传的文件 - 对已关闭文件的 I/O 操作
【发布时间】:2016-09-23 19:37:16
【问题描述】:

此应用应允许用户上传文件,然后根据文件类型执行保存任务。如果它是 PDF 文件,则会加载一个新的选择页面,提示用户选择一个文件夹。一旦选择错误:ValueError: I/O operation on closed file 会弹出,一个empty 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 页:

第 2 页:

第 3 页:

【问题讨论】:

    标签: python flask werkzeug


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-26
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2022-01-21
      • 2016-07-21
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多