Надіслати запит POST із даними, вказаними у файлі, через Curl


241

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

curl host:port/post-file -H "Content-Type: text/xml" --data "contents_of_file"


1
Вибачте, можливо, я помилково описав свою проблему, мені потрібно надсилати запит не через php-curl, а просто через команду curl з командного рядка від Linux Linux.
породити

Відповіді:


363

Ви шукаєте --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не буде.
Акумен

44

Мені потрібно зробити запит 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.