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

Bootstrap позволяет использовать стиль с помощью содержимого данных:


Пример: https://silviomoreto.github.io/bootstrap-select/examples/

29
задан William Denniss 26 May 2012 в 10:32
поделиться

7 ответов

Решено:

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), а не только в качестве окончательного решения, я написал мои шаги по отладке в моем блоге .

59
ответ дан jwfearn 26 May 2012 в 10:32
поделиться

Это для загрузки одного файла изображения с использованием «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'
0
ответ дан Mohan R 26 May 2012 в 10:32
поделиться

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

curl -H "Content-Type: multipart/related" \
  --form "data=@example.jpg;type=image/jpeg" http://localhost:3000/test
.
22
ответ дан mimming 26 May 2012 в 10:32
поделиться

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

curl -X POST -H "Content-Type: multipart/form-data; boundary=----------------------------4ebf00fbcf09" -d  

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

blar' таков, что bash будет анализировать \ r \ n как токен CRLF. Благодаря этот ответ за этот совет.

------------------------------4ebf00fbcf09\r\nContent-Disposition: form-data; name="example"\r\n\r\ntest\r\n------------------------------4ebf00fbcf09--\r\n' http://localhost:3000/test

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

blar' таков, что bash будет анализировать \ r \ n как токен CRLF. Благодаря этот ответ за этот совет.

15
ответ дан Community 26 May 2012 в 10:32
поделиться

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

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

-3
ответ дан Sanjeev Kumar 26 May 2012 в 10:32
поделиться

Вот как я бы это сделал:

curl https://httpbin.org/post \
    -H 'content-type: multipart/form-data; boundary=----FormBoundary123456789' \
    --data-binary  

Или немного более изощренно (должно быть переносимо для большинства современных оболочек):

DELIM=----FormBoundary$RANDOM$RANDOM

curl https://httpbin.org/post \
    -H "content-type: multipart/form-data; boundary=$DELIM" \
    --data-binary --$DELIM\r
Content-Disposition: form-data; name="example"\r
\r
test\r
'--$DELIM--\r
'
------FormBoundary123456789\r Content-Disposition: form-data; name="example"\r \r test\r ------FormBoundary123456789--\r '

Или немного более изощренно (должно быть переносимо для большинства современных оболочек):

DELIM=----FormBoundary$RANDOM$RANDOM

curl https://httpbin.org/post \
    -H "content-type: multipart/form-data; boundary=$DELIM" \
    --data-binary --$DELIM\r
Content-Disposition: form-data; name="example"\r
\r
test\r
'--$DELIM--\r
'
0
ответ дан Eduardo 26 May 2012 в 10:32
поделиться

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

# 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 @-)"
2
ответ дан Camilo Martin 26 May 2012 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: