Подтвердить что ты не робот

Как я могу переписать этот запрос CURL multipart/form-data без использования -F?

Как я могу переписать следующую команду CURL, чтобы она не использовала параметр -F, но все же генерирует тот же самый HTTP-запрос? то есть так, чтобы он передавал множественные/формы-данные в теле непосредственно.

curl -X POST -F example=test http://localhost:3000/test
4b9b3361

Ответ 1

Решено:

curl \
  -X POST \
  -H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" \
  --data-binary @test.txt \
  http://localhost:3000/test

Где test.txt содержит следующий текст и, самое главное, имеет окончание строк CRLF (\ r\n):

------------------------------4ebf00fbcf09
Content-Disposition: form-data; name="example"

test
------------------------------4ebf00fbcf09--

Примечания: важно использовать --data-binary вместо обычного старого -d, поскольку первый сохраняет окончание строки (что очень важно). Также обратите внимание, что граница в теле начинается с дополнительного --.

Я собираюсь повторить его, потому что это так важно, но этот файл запроса-тела должен иметь окончание строк CRLF. Многоплатформенный текстовый редактор с хорошей поддержкой конца строки - это jEdit (как установить окончания строки в jEdit).

Если вам интересно, как я это сделал (отладка с помощью приложения Ruby on Rails), а не только окончательное решение, я написал свои отладочные шаги на мой блог.

Ответ 2

Вы можете использовать аргумент --form с явно

curl -H "Content-Type: multipart/related" \
  --form "[email protected];type=image/jpeg" http://localhost:3000/test

Ответ 3

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

curl -X POST -H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" -d $'------------------------------4ebf00fbcf09\r\nContent-Disposition: form-data; name="example"\r\n\r\ntest\r\n------------------------------4ebf00fbcf09--\r\n' http://localhost:3000/test

Примечания: синтаксис $'blar' таков, что bash будет анализировать \r\n как токен CRLF. Спасибо за этот ответ.

Ответ 4

Это то, что я использую, я думаю, что он чист и не нуждается в временных файлах и не поглощает ОЗУ, если вы хотите загрузить целые файлы (поэтому нет чтения файлов в память).

# Set these two.
file='path/to/yourfile.ext'
url='http://endpoint.example.com/foo/bar'

delim="-----MultipartDelimeter$$$RANDOM$RANDOM$RANDOM"
nl=$'\r\n'
mime="$(file -b --mime-type "$file")"

# This is the "body" of the request.
data() {
    # Also make sure to set the fields you need.
    printf %s "--$delim${nl}Content-Disposition: form-data; name=\"userfile\"${nl}Content-Type: $mime$nl$nl"
    cat "$file"
    printf %s "$nl--$delim--$nl"
}

# You can later grep this, or something.
response="$(data | curl -# "$url" -H "content-type: multipart/form-data; boundary=$delim" --data-binary @-)"

Ответ 5

Это загрузка одного файла изображения с помощью "Content-Type: multipart/related",

curl --trace trace.txt -X POST -H 'Content-Type: multipart/related; boundary=boundary_1234' --data-binary $'--boundary_1234\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n{\r\n\t"title": "TestFile"\r\n}\r\n\r\n--boundary_1234\r\nContent-Type: image/jpeg\r\n\r\n' --data-binary '@Image0177.jpg' --data-binary $'\r\n--boundary_1234--\r\n' 'http://localhost:3000/google/upload/drive/v2/files?uploadType=multipart'

Ответ 6

Это для метода запроса multipart/form-data. для загрузки файла add -form filename = "@path/image.jpg; type = image/jpeg"

curl --form key = "value" - form key = "value" http://localhost:3000/test