Размещение содержимого файла с помощью CURL

15

(Следующая история предыстория, вы можете перейти к «Вопрос:», если хотите)

Есть веб-страница для одного из моих курсов, которая принимает вводимый текст (ожидается, что это код Python), а затем дает некоторый токенизированный ответ. Он предназначен для использования в качестве ссылки для лексеров Python, которые мы пишем. Я пытаюсь автоматизировать процесс тестирования и проверить свой код, не открывая браузер, не копируя текст туда-сюда и т. Д. Итак, вот что я пытаюсь сделать:

У меня есть пример файла Python с именем «x.py», и я хочу отправить его на сервер, как если бы я заполнил эту форму. Я пробовал:

curl --data-urlencode "file=@x.py" http://matt.might.net/apps/pylex/pylex.php

Но, к сожалению, это не работает правильно, потому что, очевидно, "@x.py"публикуется как содержимое моего файла (то "file=@x.py"есть то, что публикуется, а не "file=<contents-of-x.py>"). Я пробовал --formи , --dataно те , которые не работали либо.

Вопрос: В частности, если у меня есть файл с содержимым, не закодированным в URL, и содержимое этого файла должно быть частью процедуры POST и связано с определенным именем (в данном случае, file), каков правильный способ выполнить это ?

кукурузные стебли
источник
Почему бы не опубликовать это как ответ? Вы можете ответить на свой вопрос, а затем через ~ 2 дня или около того (не знаете, как долго) вы можете принять его.
BenjiWiebe
@BenjiWiebe: Хорошо, я опубликую это.
Кукурузные початки

Ответы:

25

То, что вы хотите "file@x.py"(нет =).

Из curl справочной страницы :

name @ filename Это заставит curl загружать данные из заданного файла (включая любые новые строки), URL-кодировать эти данные и передавать их в POST. К части имени добавляется знак равенства, в результате чего name = urlencoded-file-content. Обратите внимание, что имя должно быть уже закодировано в URL.

qmega
источник
2

Я оставлю ответ qmega как принятый, но я также оставлю ответ, который оставил в комментарии, для удобства чтения. Еще один способ сделать это - просто указать "file=`cat x.py`". Для полной команды это будет:

curl --data-urlencode "file=`cat x.py`" http://matt.might.net/apps/pylex/pylex.php
кукурузные стебли
источник