2016-09-23 13 views
1

このアプリケーションでは、ユーザーがファイルをアップロードできるようにし、ファイルの種類によって保存タスクを実行します。 PDFファイルの場合は、新しい選択ページがロードされ、ユーザーにフォルダの選択を促すメッセージが表示されます。 ValueError:閉鎖ファイルのI/O操作がポップアップし、空のPDFファイルが選択された場所に保存されます。アップロードされたファイルのFlaskリダイレクト - 閉鎖ファイルの入出力操作

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

答えて

1

Flaskは、受信ファイルの上に薄いラッパーであるFileStorageオブジェクトを作成します。

このオブジェクトのstream属性は、通常、(ドキュメントに従って)開いている一時ファイルを指します。私は、要求が提供されるとすぐに、この一時ファイルが閉じられているので、グローバルオブジェクトからこのストリームへの参照がクローズファイルを指すことを推測しています。あなたの周りにこのエラー ValueError: I/O operation on closed file.

1つの作業は一時的な場所に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) 
... 
関連する問題