Jak mogę przepisać to zapytanie CURL multipart / form-data bez użycia-F?

Jak mogę przepisać następujące polecenie CURL, aby nie używało opcji -F, ale generowało dokładnie to samo żądanie HTTP? tzn. tak, że przekazuje dane multipart / form-data bezpośrednio w ciele.

curl -X POST -F example=test http://localhost:3000/test
Author: William Denniss, 2012-05-26

7 answers

Rozwiązany:

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

Gdzie test.txt zawiera następujący tekst, a co najważniejsze ma CRLF (\R \ n) zakończenia linii:

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

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

Uwagi: ważne jest, aby używać --data-binary zamiast zwykłego starego -d, ponieważ pierwszy zachowuje zakończenia linii (które są bardzo ważne). Należy również zauważyć, że granica w ciele zaczyna się od dodatkowego --.

Powtórzę to, ponieważ jest to bardzo ważne, ale ten plik request-body musi mieć zakończenia linii CRLF. Tekst wieloplatformowy edytorem z dobrą obsługą końców linii jest jEdit (Jak ustawić zakończenia linii w jEdit ).

Jeśli interesuje Cię, jak to wypracowałem (debugowanie za pomocą aplikacji Ruby on Rails), a nie tylko ostateczne rozwiązanie, napisałem kroki debugowania na moim blogu .

 70
Author: William Denniss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 12:47:40

Możesz użyć argumentu --form z jawnie

curl -H "Content-Type: multipart/related" \
  --form "[email protected];type=image/jpeg" http://localhost:3000/test
 29
Author: mimming,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-11 18:56:44

Oto alternatywna odpowiedź z oryginalną instrukcją CURL napisaną ponownie przy użyciu -d jako jednolinijkowej, bez plików tymczasowych. Osobiście uważam, że podejście do plików tymczasowych jest łatwiejsze do zrozumienia, ale umieszczam to tutaj również w celach informacyjnych:

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

Uwagi: składnia $'blar' jest taka, że bash przetworzy\r \ n jako token CRLF. Dzięki tej odpowiedzi za tę wskazówkę.

 16
Author: William Denniss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:32

To jest to, czego używam, myślę, że jest czysty i nie potrzebuje tymczasowych plików ani nie pożera RAM w przypadku, gdy chcesz przesłać całe pliki (więc nie ma odczytu plików do pamięci).

# 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
Author: Camilo Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-24 08:24:14

Jest to przesyłanie jednego pliku graficznego za pomocą "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'
 1
Author: Mohan R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-03 05:47:49

Oto jak bym to zrobił:

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

Lub nieco bardziej wyrafinowany (powinien być przenośny do większości współczesnych muszli):

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
Author: Eduardo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 13:41:09

To jest dla metody multipart / form-data request. do przesłania pliku dodaj --form filename=" @ path / image.jpg; type=image/jpeg "

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

 -3
Author: Sanjeev Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-19 11:01:41