2017-06-27 3 views
0

をインクリメントしません:Pythonのフラスコは、サーバー上の画像の名前を変更、変数は、私は、画像を要求するために、次のコードを使用し

@app.route("/user/zimmer-einstellen/upload", methods=['GET', 'POST']) 
@login_required 
@check_confirmed 
def for_image_upload(): 
    if request.method == "POST": 
     MYDIR = os.path.dirname(__file__) 
     i = 1 
     for key, file in request.files.iteritems(): 
      if file: 
       filename = secure_filename(str(current_user.id) + "-bild-"+str(i)+".jpg") 
       print filename    
       file.save(os.path.join(MYDIR + "/" + app.config['UPLOAD_FOLDER'], filename)) 
       i = i + 1 
     return "images" 
    return redirect(url_for('index')) 

は私がある、私が要求するすべての画像の名前を変更し、最後にカウンタを追加しますここにi。私は彼らがこのように名前を付ける必要があります3つの画像取得のであれば:

1-bild-1.jpg 
1-bild-2.jpg 
1-bild-3.jpg 

を最後に一つだけのファイルが保存されますので、問題は、iがここにインクリメントし、すべてのファイルを上書きしないこと(最後の1)です。私は別々の新しいpythonファイルでコードを試して、それは働いたので、おそらく要求と何か関係があるはずですか?

また、ファイルの名前を変更せずに元の名前を保持すると、すべて正常に動作するので、複数のファイルが正しく要求され、目的の場所に保存されます。

+2

すべてのファイルが1つの要求で処理されていますか?たぶん、複数のリクエストがあり、それぞれには1つのファイルしかありません。この場合、毎回カウントを1から再起動し、以前のイメージを上書きしてしまいます。リクエストの見た目についてさらに詳しく説明できますか?たとえば、[Flaskデバッグツールバー](https://pypi.python.org/pypi/Flask-DebugToolbar)を使用して、何が起きているかをより詳細に知ることができます。 – Jan

+0

'print key'の出力は何ですか?この出力は、要求を確認するのに役立ちます。キーが正しい場合は、それを使って写真に名前を付けることができます。 – xiaoyi

答えて

0

@Janは暗黙のうちにその新しい要求を毎回しているので、i = 0は常にi = 0として開始します。これを解決するには、単にフォルダを調べて、その名前が空いているまでループしてください:

for key, file in request.files.iteritems(): 
    if file: 
     filename = secure_filename(str(current_user.id) + "-bild-1." + file.filename.split(".")[-1]) 

     i = 1 
     while os.path.exists(os.path.join(MYDIR + "/" + app.config['UPLOAD_FOLDER'], filename)): 
      filename = filename.split(".")[0][:-1] + str(i) + "." + filename.split(".")[1] 
        i = i + 1 

     file.save(os.path.join(MYDIR + "/" + app.config['UPLOAD_FOLDER'], filename)) 
関連する問題