Ruby - 使用RestClient帖子上传文件

时间:2012-05-21 14:24:44

标签: ruby curl rest-client

我有一个cURL,我试图将其翻译成Ruby。

cURL是这样的:

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

我的Ruby代码就是这样:

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'})

Ruby代码给了我一个400 Bad Request。授权或其他标题不是问题。我认为问题在于将--data-binary转换为Ruby。

任何帮助表示感谢。

谢谢, 阿德里安

1 个答案:

答案 0 :(得分:6)

有一些事情可能导致问题。

  1. 您希望将实际的File对象与RestClient一起使用,因此请使用File.open;它返回一个文件对象。
  2. 您在请求中包含两次图像对象;您的问题并未明确说明实际内容。例如,您正在将有效负载元素与标题混合在一起。根据带有参数RestClient.post的{​​{1}}签名,您的请求应采用以下两种形式之一:
  3. 端点是否需要命名参数?如果是,请使用以下内容:

    技术1:有效负载包含名为“upload”的字段或参数,值设置为图像对象

    url, payload, headers={}

    端点是否期望进行简单的文件上传?如果是,那么使用:

    技术2:图像文件对象作为唯一有效负载发送

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

    请注意,我没有包含result = RestClient.post( 'http://www.someurl.com/objects', image, 'Accept' => 'application/json', 'Authorization' => 'token', 'Content-Type' => 'image/jpeg', ) 标题;使用'Content-Length'时通常不需要这样做,因为它在处理文件时会为您插入。

    还有另一种发送有效负载的方法RestClient解释here

    请务必仔细阅读official docs on github

    我也是RestClient的新手,所以如果我在这种情况下错了,不要太苛刻;我会立即纠正我的任何误解。希望这有帮助!