2017-08-06 20 views
0

私は、でPOSTリクエストを受け入れるポート3000でフラスコサーバーを実行しています。ただし、ファイルのアップロード部分は機能しません。私はkeyfilevalueに等しく、フォームデータとPOSTを送信していますpythonフラスコのファイルアップロードがサイレントに失敗する

@app.route('/upload', methods=['POST']) 
def post_upload(): 
    print ("test") 
    if request.method == 'POST': 
     print ("test2") 
     zfile = request.files['file'] 
     if zfile: 
      print("test3") 
      filename = secure_filename(zfile.filename) 
      zfile.save(os.path.join(app.config['UPLOAD_FOLDER'],filename)) 
      return "success" 
     else: 
      print ("test4") 
      return "fail" 
    return 'blah' 

は、PNG画像です。クライアントが取得する応答は次のとおりです。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<title>400 Bad Request</title> 
<h1>Bad Request</h1> 
<p>The browser (or proxy) sent a request that this server could not understand.</p> 

サーバー上のプリントアウトは、次のとおりです。

* Running on http://0.0.0.0:3000/ (Press CTRL+C to quit) 
test 
test2 
104.148.224.253 - - [05/Aug/2017 19:30:04] "POST /upload HTTP/1.1" 400 - 

それはzfile = request.files['file']後に黙って失敗しているのはなぜ?

答えて

0

より良いエラーチェックのためにファイルのアップロードにフラスコの推奨フォーマットを使用してみてください。私は、 'ファイル'が辞書に存在しないと推測しているので、値をチェックするときには失敗します。 'file'はファイル入力要素の名前に置き換えなければならないので、<入力タイプ=ファイル名= file2 >の場合は、request.files ['file2']にする必要があります。 http://flask.pocoo.org/docs/0.12/patterns/fileuploads/から

def allowed_file(filename): 
    return '.' in filename and \ 
      filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS 

@app.route('/', methods=['GET', 'POST']) 
def upload_file(): 
    if request.method == 'POST': 
     # check if the post request has the file part 
     if 'file' not in request.files: 
      flash('No file part') 
      return redirect(request.url) 
     file = request.files['file'] 
     # if user does not select file, browser also 
     # submit a empty part without filename 
     if file.filename == '': 
      flash('No selected file') 
      return redirect(request.url) 
     if file and allowed_file(file.filename): 
      filename = secure_filename(file.filename) 
      file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
      return redirect(url_for('uploaded_file', 
           filename=filename)) 
    return ''' 
    <!doctype html> 
    <title>Upload new File</title> 
    <h1>Upload new File</h1> 
    <form method=post enctype=multipart/form-data> 
     <p><input type=file name=file> 
     <input type=submit value=Upload> 
    </form> 
    ''' 
+0

これを最初に試しました。 'No file part'という出力が出ます。私は 'key' =' file'と 'value'がPNG画像である形式でPOSTMANを使用しています。 – bee

0

は、私は結果を台無しにされた前回のPOSTMAN要求から残っていくつかのヘッダを持っていたが判明します。私はそれらを削除し、それは働いた。ヘッダは

Authorization:Basic ... 
Content-Type:application/x-www-form-urlencoded 

私は、フォームのエンコーディングを台無しContent-Typeヘッダを推測しているのだったが、それは静かに失敗したので、私は、どのようにか、なぜわかりません。

0

1つの記事から同じ質問があります。これを参考にすることができます。私はフラスコの残りのAPIを使用しています。 here

パーサーは次のようにする必要があります。

parser.add_argument('file', type=werkzeug.datastructures.FileStorage, location='files' )

関連する問題