2016-09-23 3 views
1

이 응용 프로그램은 사용자가 파일을 업로드 할 수있게 허용해야하며 파일 형식에 따라 저장 작업을 수행합니다. PDF 파일 인 경우 새 선택 페이지가로드되어 사용자에게 폴더를 선택하라는 메시지가 표시됩니다. ValueError : 닫힌 파일의 입출력 작업이 나타나고 비어있는 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.

한 일이 주위에 임시 위치에 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) 
...