views:

1590

answers:

5

I'm trying to do file uploads with ruby 1.8 and it seems like there are no good out-of-the-box solutions. They all seem to need some 3rd party patch or fork of a project to work. I would use mechanize but I actually need to interface with an xml api and mechanize seems to be made specifically for dealing directly with webpages. I've tried RestClient but it doesn't have that functionality for multipart forms out of the box, you have to use a fork of the project to get it to work. Similar situations seem to exist for Net:HTTP I'm thinking curb would be the way to go since I may want to use multicurl anyways for some other things I plan to do. However, on my windows machine I can't seem to install the curb gem. gem install curb gives an error saying I need to specify where the curl library lives.. I've tried passing options to extconf but no luck so far. Here is the output of gem install curb without any options

C:\ruby\lib\ruby\gems\1.8\gems\curb-0.5.4.0>gem install curb
Building native extensions.  This could take a while...
ERROR:  Error installing curb:
        ERROR: Failed to build gem native extension.

C:/ruby/bin/ruby.exe extconf.rb
checking for curl-config... no
checking for main() in curl.lib... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --srcdir=.
        --curdir
        --ruby=C:/ruby/bin/ruby
        --with-curl-dir
        --without-curl-dir
        --with-curl-include
        --without-curl-include=${curl-dir}/include
        --with-curl-lib
        --without-curl-lib=${curl-dir}/lib
        --with-curllib
        --without-curllib
extconf.rb:12:   Can't find libcurl or curl/curl.h (RuntimeError)

  Try passing --with-curl-dir or --with-curl-lib and --with-curl-include
  options to extconf.


Gem files will remain installed in C:/ruby/lib/ruby/gems/1.8/gems/curb-0.5.4.0 for inspection.
Results logged to C:/ruby/lib/ruby/gems/1.8/gems/curb-0.5.4.0/ext/gem_make.out

Any ideas how I can get this to work?

A: 

When you say you passed configuration options to extconf.rb, did you mean in the gem install command?

If not, I believe it would be something along the lines of

gem install curb -- --with-curl-dir=dir

It might be a different config option, but the -- is that bit you need to pass it configure options.

Robert Rouse
The README file says to pass options like this:rake install EXTCONF_OPTS='--with-curl-dir=/path/to/libcurl --prefix=/what/ever'So I did something similar:rake install EXTCONF_OPTS='--with-curl-dir=c:/curl'I tried a few variations of that syntax/quotes, and also tried specifying explicitly using with-curl-dir/with-curl-include fields instead of with-curl-dirNo luck, and it doesn't appear very many people are running curl with ruby online so it may not be a good choice (unfortunately)
Matt Wolfe
+1  A: 

Looking at the underlying issue you are trying to solve. I was looking for a multpart-post client before and spent a lot of time trying out diffrent gems/tools. The only one i found that worked satisfactory was Nick Siegers multipart-post gem

It was very straightforward to use, I highly recommend it.

Here is sample code i made for my test

require "rubygems"
require 'net/http/post/multipart'

url = URI.parse('http://localhost:3000/mytest/1.xml')
File.open("c:/temp/readme.txt") do |jpg|
  req = Net::HTTP::Put::Multipart.new url.path,
    "mytest[attachment]" => UploadIO.new(jpg, "text/plain", "c:/temp/readme.txt")
  res = Net::HTTP.start(url.host, url.port) do |http|
    http.request(req)
  end
  puts res.inspect
end
Mikael R
I don't think this will allow multiple file uploads in a single request will it. Otherwise it looks like a good way to upload a single file in a request
Matt Wolfe
+2  A: 

Matt,

I've had trouble installing the curb gem in Windows before. In trying to see how others had solved this I came across a lot of questions and not very many solutions. Having to do it again tonight I decided to document my steps and post the results: http://beginrescue.blogspot.com/2010/07/installing-curb-with-ruby-191-in.html

Sorry for the blogspam, hope this is useful for somebody.

pete

phiggy
A: 

As I commented already, I did find a solution which was simply using the rest-client provided in the github gems.. gem install rest-client will get the job done. From there you can do a multipart post which can contain 1 or more files.. It has all the flexibility one could need in a rest-client. See the documentation here: http://rdoc.info/projects/archiloque/rest-client for examples on how to use it.

The only thing I found that it didn't do correctly was parsing cookies. The cookies my company uses can have equal signs in the values and it doesn't parse them correctly. I had put in some hacks to get around the issue but eventually that came back to bite me.. So just the other day I started analyzing the code from Mechanize/WEBrick and was able to utilize the CookieJar from Mechanize to manage cookies from the rest-client.. Hopefully I can get the author of the rest-client to build this functionality into the rest-client so others won't have the same problems I had..

Matt Wolfe
A: 

Execute Below command and its works

gem install curb --platform=mswin32

Amit