2015-06-15 53 views
2

我会说,我对Flask非常新(这是我的第一个项目),我有兴趣在黑客攻击它,而不是最佳做法。Flask奇怪的行为w /文件夹创建/文件上传

我目前的代码无法在图片目录中创建用户命名的文件夹。我已经尝试过在这里寻找一些答案,但无济于事,我可以让这三件事情协调一致地工作。这是有问题的功能。

@app.route('/', methods = ["GET","POST"]) 
def upload_file(): 
    if request.method == 'POST': 
     file = request.files['file'] 
     if file and allowed_file(file.filename): 
      filename = secure_filename(file.filename) 
      foo = request.form.get('name') 
      if not os.path.exists("/pictures/directory"): os.makedirs("/pictures"+foo) 
      app.config["UPLOAD_FOLDER"] = "/pictures" + foo 
      file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
    else: 
     return render_template("upload.html") 
    return render_template("index.html") 

如果任何人有兴趣也考虑看看为什么upload.html使得第一(预计),但“继续”按钮无法呈现的index.html,我会非常感激。

这里的回购,如果任何人的好奇,它的其余部分:https://bitbucket.org/dillon9/ss

编辑1:感谢你们俩我有一个半功能前端和一个功能齐全的后端。新代码被推送。希望我可以接受你的两个答案

回答

1

这是因为你的foo变量不包含用户给出的值。你第一次得到您的用户与

foo = request.form.get('name') 

指定的名称,但然后立即使用它

foo = "/directory/" 

编辑之前分配给同一个变量别的东西:现在可能正在使用C创建目录:\ 或者其他的东西。将代码更改为这样的代码

@app.route('/', methods=['GET', 'POST']) 
    def upload_file(): 
     if request.method == 'POST': 
      file = request.files['file'] 
      if file and allowed_file(file.filename): 
       filename = secure_filename(file.filename) 
       foo = request.form['name'] 
       path = os.path.dirname(os.path.abspath(__file__)) + "/pictures/"+foo 
       if not os.path.exists(path):   
        os.makedirs(path) 
       app.config["UPLOAD_FOLDER"] = path 
       file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
     else: 
      return render_template("upload.html") 
     return render_template("index.html") 
+0

哈哈我完全忘了把它放在这里,第二个foo任务是用于调试以测试实际上可以创建的文件夹。很好,我会编辑 –

+0

你能保存图片吗? –

+0

没有什么能够一起工作,我不是超级担心它的上传部分,因为它已经在过去工作,只是没有这个当前代码 –

2

代码中有几件事需要更改。

第一:

通常根页"/"被映射到一个名为index功能。

@app.route('/', methods = ["GET","POST"]) 
def index(): 
    if request.method == 'POST': 
     file = request.files['file'] 
     if file and allowed_file(file.filename): 
      filename = secure_filename(file.filename) 
      foo = request.form.get('name') 
      if not os.path.exists("/pictures/directory"): 
       os.makedirs("/pictures"+foo) 
      app.config["UPLOAD_FOLDER"] = "/pictures" + foo 
      file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
    else: 
     return render_template("upload.html") 
    return render_template("index.html") 

二:

它将使使用单一的按钮更有意义 - 在这种情况下Update - 用于更新内容和重定向,那么你可以放弃Continue按钮。

三:

upload.html文件必须更正表单代码

<form action="" method=post enctype=multipart/form-data> 

<form action="{{ url_for("index") }}" method= "post" enctype= "multipart/form-data"> 

所以你给action属性为一个值处理这种形式的函数的url。最后,在值的周围添加双引号。