Попытка переслать форму данных с файлом на другой веб-сервис - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь переслать запрос формы данных в другой веб-сервис, но когда я получаю новый запрос в другом веб-сервисе, он содержит данные формы, но не данные файла:

[+] Forward 1: ImmutableMultiDict([('content', <FileStorage: '0,1.txt' ('text/plain')>)])
[+] Forward 2: ImmutableMultiDict([('content', <FileStorage: 'content' (None)>)])

В коде вы можете видеть, что индекс отображает форму. Вы выбираете файл, и он отправляет его в первый веб-сервис (forward1). В этом веб-сервисе он пытается отправить request.form и request.files во второй веб-сервис (forward2). Но не вся информация поступает правильно.

Что может происходить?

Я пробовал это, но это решение не работает для меня. Пересылка multipart / form-data другому сервису (python, бутылка, запросы)

import requests
from flask import Flask, request, url_for
from werkzeug.datastructures import FileStorage


app = Flask(__name__)

@app.route('/')
def index(methods=['GET', 'POST']):
    return """<html>
                <form method="post" action="{}" enctype="multipart/form-data">
                <input name="content" type="file" />
                <input type="submit">
                </form>
            </html>""".format(url_for('forward1'))

@app.route('/fw1', methods=['GET', 'POST'])
def forward1():
    if request.method == "POST":

        payload = request.form
        files = request.files

        print("[+] Forward 1:", request.files)

        response = requests.request(
            "POST", 
            "http://XXX.XXX.XXX.XXX:5000/fw2", 
            data=payload, 
            files=files
        )

        return ""

@app.route('/fw2', methods=['GET', 'POST'])
def forward2():
    if request.method == "POST":
        print("[+] Forward 2:", request.files)
        return ""

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug = True)

1 Ответ

0 голосов
/ 14 октября 2019

Решение:

response = requests.request(
    "POST", 
    "http://XXX.XXX.XXX.XXX/fw2", 
    data=payload, 
    files={files["file"].name : (files["file"].filename, files["file"].file, files["file"].mimetype)}
)
...