2017-08-24 3 views
0

Je dois envoyer des fichiers à un serveur qui contient du contenu multipart/mixte. Pour exemple:Comment envoyer multipart/mixed avec CURL avec predisposé boudary?

------------------------------1b479dca9c3e 
Content-Disposition: form-data; name="one_part" 
Content-Type: text/xml; charset=utf-8 
XX-Project-Type: METADATA 

<?xml version="1.0" encoding="utf-8"?> 
<My_MSG version="1"> 
    <MSG date="2014-08-20T18:39:59.154326+00:00"> 
    <METADATA mess_id="sd1212sd05AZ"> 
     <CONVERSION> 
     <FILE name="foo.bar"/> 
     <FILE name="ping.pong"/> 
     <FILE name="abc.def"/> 
     </CONVERSION> 
    </METADATA> 
    </MSG> 
</My_MSG> 

------------------------------1b479dca9c3e 
Content-Disposition: form-data; name="one_part" 
Content-Type: text/xml; charset=utf-8 
XX-Project-Type: METADATA 

<?xml version="1.0" encoding="utf-8"?> 
<My_MSG version="1"> 
    <MSG date="2015-08-20T19:39:59.154326+00:00"> 
    <METADATA mess_id="az987456321"> 
     <CONVERSION> 
     <FILE name="bar.foo"/> 
     <FILE name="pong.ping"/> 
     <FILE name="def.abc"/> 
     </CONVERSION> 
    </METADATA> 
    </MSG> 
</My_MSG> 

------------------------------1b479dca9c3e-- 

Comme vous pouvez le voir le boudary multipart est déjà défini dans le fichier à envoyer, afin de l'envoyer avec CURL j'utiliser la commande suivante:

curl -d @/tmp/exemple.file -XPOST http://myServer:8000/multipartService -H "content-type: multipart/Mixed ; boundary=----------------------------1b479dca9c3e" 

Mais le serveur ne réussit pas pour gérer les pièces. Pour le moment, je n'ai pas les journaux de serveur, mais je joue un tcpdump pour voir ce qui est envoyée au serveur:

tcpdumpResult

Il semble que les espaces et les retours chariot sont supprimés dans la demande d'envoi et il pourrait Expliquez que le contenu de la requête ne peut pas être traité comme multipart/mixed par le serveur ...

Savez-vous comment envoyer mon fichier au format multipart/mixed mixed?


Modifier pour hanshenrik:

enter image description here

+0

Il vous suffit de supprimer l'en-tête de type de contenu et de le générer automatiquement par Curl. Cela devrait fonctionner. Je suis vraiment surpris que Curl a analysé votre en-tête personnalisé et a adopté la limite. aussi drop -XPOST – hanshenrik

+0

@hanshenrik voir mon edit, les fallbacks de type de contenu par défaut à application/x-www-form-urlencoded:/ – Fractaliste

Répondre

1

Soit friser faire le POST multipart lui-même et laissez-le gérer complètement le séparateur par lui-même à la place. Si par exemple vous souhaitez publier deux parties avec le contenu lu à partir de deux fichiers différents, faites comme ceci:

curl -F "part_one=<file1.xml" -F "part_two=<file2.xml" \ 
http://myServer:8000/multipartService 

Insister?

Ensuite, vous devez do the whole thing yourselfet utiliser --data-binary.

+0

Cela fonctionne bien avec '--data-binary' mais certains en-têtes doivent être passés avec CURLS's L'option '-H' car deux requêtes sont en fait envoyées. – Fractaliste

+0

Désolé, je ne peux pas déchiffrer ce que cela signifie réellement ... –