web-dev-qa-db-fra.com

Quelle est la bonne façon de POST multipart / form-data en utilisant curl?

J'ai utilisé cette syntaxe pour publier un fichier avec quelques paramètres:

curl -v -include --form "key1=value1" --form upload=localfilename URL

Le fichier est environ 500K en taille. Tout d'abord, je vois une longueur de contenu de 254 du côté émission. Plus tard, la longueur du contenu de la réponse du serveur est 0. Où vais-je mal?

Voici la trace complète de la commande.

* Couldn't find Host xxx.xxx.xxx.xxx in the _netrc file; using defaults
* About to connect() to xxx.xxx.xxx.xxx port yyyy (#0)
*   Trying xxx.xxx.xxx.xxx...
* Adding handle: conn: 0x4b96a0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x4b96a0) send_pipe: 1, recv_pipe: 0
* Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) port yyyy (#0)
* POST /zzzzzz/UploadFile HTTP/1.1
* User-Agent: curl/7.32.0
* Host: xxx.xxx.xxx.xxx:yyyy
* Accept: */*
* Content-Length: 254
* Expect: 100-continue
* Content-Type: multipart/form-data; boundary=------------------------948a6137eef50079
*
* HTTP/1.1 100 Continue
* HTTP/1.1 100 Continue

* HTTP/1.1 200 OK
* HTTP/1.1 200 OK
* Server Apache-Coyote/1.1 is not blacklisted
* Server: Apache-Coyote/1.1
* Server: Apache-Coyote/1.1
* Added cookie JSESSIONID="C1D7DD042E250211D9DEA82688876F88" for domain xxx.xxx.xxx.xxx, path /zzzzz/, expire 0
* Set-Cookie: JSESSIONID=C1D7DD042E250211D9DEA82688876F88; Path=/zzzzzz/;
* HttpOnly
* Set-Cookie: JSESSIONID=C1D7DD042E250211D9DEA82688876F88; Path=/zzzzzz/; HttpOnly
* Content-Type: text/html;charset=ISO-8859-1
Content-Type: text/html;charset=ISO-8859-1
* Content-Length: 0
* Content-Length: 0
* Date: Tue, 01 Oct 2013 11:54:24 GMT
* Date: Tue, 01 Oct 2013 11:54:24 GMT
* Connection #0 to Host xxx.xxx.xxx.xxx left intact
131
Kamalakshi

La syntaxe suivante le corrige pour vous:

curl -v -F key1=value1 -F upload=@localfilename URL
205
Kamalakshi

pour charger un fichier en utilisant curl dans Windows, j’ai trouvé que le chemin nécessitait des guillemets doubles échappés

par exemple.

curl -v -F 'upload=@\"C:/myfile.txt\"' URL
14
Logan Scott

C'est ce qui a fonctionné pour moi

curl -F file=@filename URL
5
smac89

J'ai eu du mal à envoyer une requête multipart HTTP PUT avec curl à un serveur Java. J'ai simplement essayé

curl -X PUT URL \
   --header 'Content-Type: multipart/form-data; boundary=---------BOUNDARY' \
   --data-binary @file

et le contenu du fichier était

-----------BOUNDARY
Content-Disposition: form-data; name="name1"
Content-Type: application/xml;version=1.0;charset=UTF-8

<xml>content</xml>
-----------BOUNDARY
Content-Disposition: form-data; name="name2"
Content-Type: text/plain

content
-----------BOUNDARY--

mais j'ai toujours eu une erreur que la limite était incorrecte. Après un débogage d'arrière-plan Java, j'ai découvert que l'implémentation de Java ajoutait un \r\n-- comme préfixe à la limite. Ainsi, après avoir modifié mon fichier d'entrée en

                          <-- here's the CRLF
-------------BOUNDARY       <-- added '--' at the beginning
...
-------------BOUNDARY       <-- added '--' at the beginning
...
-------------BOUNDARY--     <-- added '--' at the beginning

tout fonctionne bien!

tl; dr

Ajoutez une nouvelle ligne (CRLF \r\n) au début du contenu de la limite en plusieurs parties et -- au début des limites, puis réessayez.

Peut-être envoyez-vous une requête à un serveur Java qui a besoin de ces modifications dans la limite.

1
Lusk116

Sur Windows 10, curl 7.28.1 dans powershell, j’ai trouvé ce qui suit pour moi:

$filePath = "c:\temp\dir with spaces\myfile.wav"
$curlPath = ("myfilename=@" + $filePath)
curl -v -F $curlPath URL
0
Matt