Отправить POST-запрос с данными, указанными в файле через Curl

242

Мне нужно сделать запрос POST через Curl из командной строки. Данные для этого запроса находятся в файле. Я знаю, что через PUT это можно сделать с помощью --upload-fileопции.

curl host:port/post-file -H "Content-Type: text/xml" --data "contents_of_file"
breedish
источник
Проверьте мой ответ, stackoverflow.com/questions/6213509/send-json-post-using-php/…
Мухаммед Зеешан
1
Извините, возможно, я ошибочно описал свою проблему, мне нужно отправить запрос не через php-curl, а просто через команду curl из командной строки из linux os.
разведение

Ответы:

365

Вы ищете --data-binaryаргумент:

curl -i -X POST host:port/post-file \
  -H "Content-Type: text/xml" \
  --data-binary "@path/to/file"

В приведенном выше примере -iраспечатывает все заголовки, чтобы вы могли видеть, что происходит, и -X POSTясно указывает, что это пост. Оба из них могут быть безопасно опущены без изменения поведения на проводе. Путь к файлу должен предшествовать @символу, поэтому curlзнает, что читать из файла.

Ричард Дж
источник
@ ɢʜʘʂʈʀɛɔʘɴ в этом случае это будет.xml
dennismonsewicz
54
@часть чрезвычайно важно!
Рон Кляйн
Поэтому мы используем параметр --data-binary, но фактическое содержимое файла может быть текстовым? Поскольку XML обычно не является двоичным.
Дэвид
8
на самом деле вы можете использовать просто -d флаг
Анатолий Якимчук
16
@ Tol182 -dприведет curlк лишению перевода строки, но --data-binaryне будет.
Acumenus
45

Мне нужно сделать запрос POST через Curl из командной строки. Данные для этого запроса находятся в файле ...

Все, что вам нужно сделать, это --dataначать аргумент с @:

curl -H "Content-Type: text/xml" --data "@path_of_file" host:port/post-file-path

Например, если у вас есть данные в файле с именем, stuff.xmlвы бы сделали что-то вроде:

curl -H "Content-Type: text/xml" --data "@stuff.xml" host:port/post-file-path

stuff.xmlИмя файл может быть заменено с относительным или полным путем к файлу: @../xml/stuff.xml, @/var/tmp/stuff.xml, ...

Серый
источник
2
В случае, если вам нужно отправить именованное поле, вы также можете использовать --data "name@stuff".
Герман
15

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

curl -X POST -i -F "parametername=@filename" -F "additional_parm=param2" host:port/xxx

Лукас Лю
источник
Спасибо! 1. Решение не работает для меня. parametername=действительно помог мне :)
Киборг
3

Большинство ответов здесь идеально, но когда я попал сюда для решения своей конкретной проблемы, мне нужно загрузить двоичный файл (электронная таблица XLSX), используя метод POST, я вижу одну вещь, отсутствующую , т.е. обычно это не просто файл, который вы загружаете, вы можете иметь больше элементов данных формы , таких как комментарий к файлу или теги к файлу и т. д., как было в моем случае. Поэтому я хотел бы добавить это здесь, так как это был мой вариант использования, чтобы он мог помочь другим.

curl -POST -F comment=mycomment -F file_type=XLSX -F file_data=@/your/path/to/file.XLSX http://yourhost.example.com/api/example_url
Красный мальчик
источник