Загрузите файл на сервер фляги Python, используя curl

Я пытаюсь загрузить файл на сервер, используя curl и python flask. Ниже у меня есть код того, как я это реализовал. Любые идеи о том, что я делаю неправильно.

curl -i -X PUT -F name=Test -F [email protected] "http://localhost:5000/" 

@app.route("/", methods=['POST','PUT'])
def hello():
    file = request.files['Test']
    if file and allowed_file(file.filename):
        filename=secure_filename(file.filename)
        print filename

    return "Success"

Ниже приведена ошибка, которую сервер отправляет обратно


400 Bad Request
Bad Request
<p>The browser (or proxy) sent a request that this server could not understand.</p>

Заранее спасибо.

 snahor26 июн. 2013 г., 22:44
Ваш код выглядит хорошо, что вы получите, если попытаетесь: curl -X PUT -F [email protected]локальный: 5000
 Doobeh26 июн. 2013 г., 22:31
Ваш код работает, если вы размещаете данные, например,curl -F "[email protected]" http://127.0.0.1:5000 поэтому сужает вашу проблему до того, как выпереработка запросов PUT во Flask.
 snahor02 июл. 2015 г., 05:44
@Piotr AFAIK это должно работать на окнах. Каков результат запуска этого?
 Piotr02 июл. 2015 г., 01:12
@snahor, как эта команда должна выглядеть в Windows? '@ Foo.txt» не работает ... curl.exe -X PUT -F Test = ...? ... localhost: 5000
 codegeek26 июн. 2013 г., 22:40
Я помню какой-то поток, который говорит, что request.files не работает с PUT. Можете ли вы попробовать request.data вместо этого?
 Piotr02 июл. 2015 г., 22:21
да ... так как это работает точно? @ foo.txt заменяется содержимым файла? Я получаю его на стороне сервера, но мне интересно, как это работает точно
 mata26 июн. 2013 г., 23:25
@codegeek - он отлично работает с PUT или POST.

Ответы на вопрос(2)

чтобы заставить это работать, так что вот очень явное решение:

Здесь мы создаем простое приложение для колб, которое имеет два маршрута, один для проверки работоспособности приложения ("Привет, мир") и один, чтобы напечатать имя файла (чтобы убедиться, что мы получили файл).

from flask import Flask, request
from werkzeug.utils import secure_filename

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello World"

@app.route("/print_filename", methods=['POST','PUT'])
def print_filename():
    file = request.files['file']
    filename=secure_filename(file.filename)   
    return filename

if __name__=="__main__":
    app.run(port=6969, debug=True)

Сначала мы проверяем, можем ли мы даже связаться с приложением:

curl http://localhost:6969
>Hello World

Теперь давайте разместим файл и получим его имя. Мы ссылаемся на файл с "Файл =» как "request.files [»файл']" относится к "файл", Здесь мы идем в каталог с файлом под названием "test.txt ":

curl -X POST -F [email protected] http://localhost:6969/print_filename
>test.txt

Наконец, мы хотим использовать пути к файлам:

curl -X POST -F [email protected]"/path/to/my/file/test.txt" http://localhost:6969/print_filename
>test.txt

Теперь, когда мы подтвердили, что действительно можем получить файл, вы можете делать с ним все, что захотите, со стандартным кодом Python.

Решение Вопроса

что выповторно передает два содержимого формы, один файл называетсяfiledataи одно поле формы называетсяname, Так что вы можете сделать это:

file = request.files['filedata']   # gives you a FileStorage
test = request.form['name']        # gives you the string 'Test'

ноrequest.files['Test'] Безразлично»не существует.

 Dinesh VG27 мар. 2017 г., 19:47
как вы добавляете файлы?
 Dinesh VG29 мар. 2017 г., 12:32
У меня есть html-страница, через которую я - отправляю запрос на публикацию сообщения - прикрепив файл, который я пробовал, используя команду curl,т работа. Я выяснил позже ... Я должен был дать две пары ключ-значение. Одна для имени файла, а другая для самого файла. И получил это на работу ..
 mata28 мар. 2017 г., 00:15
@DineshVG I 'Я не уверен, что вы имеете в виду под своим вопросом. Команда curl отправляет почтовый запрос с данным файлом или данными формы на сервер, где они могут быть доступны в маршруте объекта запроса, как показано.

Ваш ответ на вопрос