# Errors while file uploading thr 'net/http' or 'rest-open-uri' client

**URL:** <https://www.ruby-forum.com/t/errors-while-file-uploading-thr-net-http-or-rest-open-uri-client/151677>\
**Category:** Ruby\
**Created:** [October 24, 2008, 10:47am UTC](https://www.ruby-forum.com/t/errors-while-file-uploading-thr-net-http-or-rest-open-uri-client/151677 "2008-10-24T10:47:01Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [October 24, 2008, 10:47am UTC](https://www.ruby-forum.com/t/errors-while-file-uploading-thr-net-http-or-rest-open-uri-client/151677/1 "2008-10-24T10:47:01Z")

</div>

I am trying to upload a file to API thr the ‘net/http’ or  
‘rest-open-uri’  
client,  
the code I have done is  
require ‘rest-open-uri’  
require ‘uri’  
require ‘cgi’  
require ‘net/http’  
require ‘net/https’  
require ‘mime/types’

username=“XXXXXXXXXXXXXXXXXXXXXXX”  
password=“XXXXXXXXXXXXXXXXXXXXXX”

def form\_encoded(hash)  
encoded = []  
hash.each do |key, value|  
encoded \<\< CGI.escape(key) + ‘=’ + CGI.escape(value)  
end  
return encoded.join(‘&’)  
end  
boundary\_token = [Array.new(8) {rand(256)}].join  
boundary\_marker = “–#{boundary\_token}\r\n”  
file = File.open(“my\_img.jpg”)  
filename = File.basename(file.path)  
mime\_type = MIME::Types.of(filename)  
@service\_root = “#######################”  
representation =  
form\_encoded({  
“Content-Type”=\>“#{mime\_type}\r\n\r\n#{file.read}\r\n”,“Content-Transfer-Encoding”  
=\> “binary\r\n”, “Content-Disposition”  
=\> “form-data” , “uploaded\_data[filename]”=\>“#{filename}”})  
puts representation  
response = open(@service\_root + ‘/file/uploads.xml’, :method  
=\> :post,:http\_basic\_authentication =\> [username,  
password],:body=\>representation )

puts response.read  
The error I am getting is…  
from  
/lib/ruby/gems/1.8/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:659:in  
`buffer_open' from /lib/ruby/gems/1.8/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:194:in `open\_loop’  
from  
/lib/ruby/gems/1.8/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:192:in  
`catch' from /lib/ruby/gems/1.8/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:192:in `open\_loop’  
from  
/lib/ruby/gems/1.8/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:162:in  
`open_uri' from /lib/ruby/gems/1.8/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:561:in `open’  
from  
/lib/ruby/gems/1.8/gems/rest-open-uri-1.0.0/lib/rest-open-uri.rb:35:in  
`open’  
I am not really sure about the way to be done!  
I have referred the urls

> <https://stackoverflow.com/questions/116353/uploading-files-in-ruby-on-rails>

[http://www.realityforge.org/articles/2006/03/02/upload-a-file-via-post-with-net-http](http://www.realityforge.org/articles/2006/03/02/upload-a-file-via-post-with-net-http)

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [October 24, 2008, 4:45pm UTC](https://www.ruby-forum.com/t/errors-while-file-uploading-thr-net-http-or-rest-open-uri-client/151677/2 "2008-10-24T16:45:07Z")

</div>

> [http://www.realityforge.org/articles/2006/03/02/upload-a-file-via-post-with-net-http](http://www.realityforge.org/articles/2006/03/02/upload-a-file-via-post-with-net-http)

That’s the document I was going to point you at. It Works For Me [TM],  
for an application which expects to get a multipart/form-data POST.

Now, what you are doing seems very strange; you appear to be  
form-encoding the Content-Type and Content-Transfer-Encoding headers and  
sending them in the body instead of sending them as HTTP headers.

Furthermore, the place you are posting to is  
[http://something/file/uploads.xml](http://something/file/uploads.xml) which looks like you should be sending  
an XML document instead of form-encoded data anyway. And you are  
creating a MIME boundary string too, even though you’re not sending it!

You should be aware that there are at least three completely different  
ways of uploading data via a POST:

(1) Raw content in the body, such as an image or an XML document

(2) application/x-www-form-encoded, where the body consists of  
name1=value1&name2=value2&…

(3) multipart/form-data, where the body consists of multiple MIME  
sections, one for each parameter in the form [this is the usual case for  
uploads of “attachments” through a web browser]

If you try to use the wrong way of uploading the data, or worse try to  
mix all three together as you appear to be doing, it will be meaningless  
to the server.

Since there are so many variables and possible things to go wrong, you  
first need to work out what on earth it is you’re trying to do in the  
first place. You need to work from something concrete, such as:

(a) the actual server-side code which receives the data; or  
(b) a HTML form which successfully uploads the required data via a  
browser; or  
(c) a tcpdump of a successful upload from some other client; or  
(d) a hard-and-fast accurate technical specification for the format the  
server is expecting to receive.

Then at least it should be possible to work out which of formats (1),  
(2) or (3) you need to send, and then you can google for some working  
code which does that.

Brian.

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [October 24, 2008, 5:23pm UTC](https://www.ruby-forum.com/t/errors-while-file-uploading-thr-net-http-or-rest-open-uri-client/151677/3 "2008-10-24T17:23:16Z")

</div>

I have used this code, which has solved my problem,  
A gem curb is used, which made my code extremely easy!

require ‘rubygems’  
require ‘curb’  
c = Curl::Easy.new(“https://the\_url\_goes.here”)  
c.multipart\_form\_post = true  
c.http\_post(Curl::PostField.content(‘uploaded\_wav’,‘saurabh\_upload.wav’),Curl::PostField.content(‘api\_key’,  
'00000000000000000000000000Curl::PostField.content(‘action’,  
‘broadcast.create’),Curl::PostField.content(‘name’,  
‘test\_saurabh’),Curl::PostField.content(‘number\_list’, ‘123456789’))  
puts c.body\_str  
puts c.header\_str  
puts c.methods.sort

On Fri, Oct 24, 2008 at 8:15 PM, Brian C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Furthermore, the place you are posting to is  
> name1=value1&name2=value2&…  
> first need to work out what on earth it is you’re trying to do in the  
> (2) or (3) you need to send, and then you can google for some working  
> code which does that.
> 
> ## Brian.
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

## –

Thanks and Regards  
Saurabh P.  
+91-9922071155  
skype: sorab\_pune  
yahoo & gtalk: saurabh.purnaye  
msn: removed\_email\_address@domain.invalid
