2012-05-21 5 views
1

J'ai un cURL que j'essaie de traduire en Ruby.Ruby - Téléchargement d'un fichier en utilisant RestClient post

le rotationnel est la suivante:

curl -i -k -H "Accept: application/json" -H "Authorization: token" -H "Content-Type: image/jpeg" -H "Content-Length: 44062" --data-binary "gullfoss.jpg" http://www.someurl.com/objects 

Code Mon Ruby est la suivante:

image = File.read('uploads/images/gullfoss.jpg') 
result = RestClient.post('http://www.someurl.com/objects',image,{'upload' => image, 'Accept' => 'application/json', 'Authorization' => 'token', 'Content-Type' => 'image/jpeg', 'Content-Length' => '44062'}) 

Le code Ruby me donne de nouveau 400 Bad Request. Ce n'est pas un problème avec l'autorisation ou les autres en-têtes. Je pense que le problème réside dans la traduction de --data-binary en Ruby.

Toute aide appréciée.

Merci, Adrian

+0

Dans l'exemple, j'ai défini les données de publication sur l'image, mais j'ai également essayé de laisser ce blanc. – Adrian

+0

Essayez 'image = Fichier.open ('uploads/images/gullfoss.jpg', 'rb') {| io | io.read} ' –

+0

http://stackoverflow.com/questions/2863164/how-do-i-use-rest-client-for-ruby-to-post-an-image –

Répondre

5

Il y a quelques petites choses qui pourraient causer le problème.

  1. Vous voulez utiliser un objet File réel avec RestClient, utilisez donc File.open; il retourne un objet fichier.
  2. Vous incluez l'objet image deux fois dans votre requête; le contenu réel n'est pas clair à partir de votre question. Vous mélangez des éléments de charge utile avec des en-têtes, par exemple. Sur la base de la signature de RestClient.post, qui prend des arguments url, payload, headers={}, votre demande doit prendre l'une des deux formes suivantes:

est le point final attend les paramètres nommés? Si oui, alors utilisez ce qui suit:

Technique 1: la charge utile comprend un champ ou d'un paramètre nommé « upload » et la valeur est définie sur l'objet image

result = RestClient.post(
    'http://www.someurl.com/objects', 
    { 'upload' => image }, 
    'Accept' => 'application/json', 
    'Authorization' => 'token', 
    'Content-Type' => 'image/jpeg', 
) 

est le point final attend un simple fichier télécharger? Dans ce cas utilisez:

Technique 2: l'objet de fichier d'image est envoyé comme la seule charge utile

result = RestClient.post(
    'http://www.someurl.com/objects', 
    image, 
    'Accept' => 'application/json', 
    'Authorization' => 'token', 
    'Content-Type' => 'image/jpeg', 
) 

Notez que je ne comprend pas l'en-tête 'Content-Length'; cela n'est généralement pas requis lors de l'utilisation de RestClient, car il est inséré pour vous lors du traitement des fichiers.

Il existe une autre façon d'envoyer des charges utiles avec RestClient expliqué here. Assurez-vous de lire également le official docs on github.

Je suis aussi nouveau à RestClient donc si je me trompe dans ce cas ne soyez pas trop dur; Je corrigerai mes idées fausses immédiatement. J'espère que cela t'aides!

Questions connexes