Home

Awesome

multiparty

Easily generate a multipart/form-data header and body.

Usage

You can add multiple values, corresponding to multiple <input> statements:

multiparty = Multiparty.new
multiparty[:name] = "David Verhasselt"
multiparty[:state] = "awesome"
# or in one statement:
multiparty << {:name => "David Verhasselt", :state => "awesome"}

multiparty[:avatar] = {:filename => "avatar.jpg", :content => "...jpegdata..."}

# Retrieve the header and body like this:
multiparty.header
# Content-Type: multipart/form-data; boundary=multiparty-boundary-1342
multiparty.body
# --multiparty-boundary-1342
# Content-Disposition: form-data; name="name"
#
# David Verhasselt
# --multiparty-boundary-1342
# Content-Disposition: form-data; name="state"
# 
# awesome
# --multiparty-boundary-1342
# Content-Disposition: form-data; name="avatar"; filename="avatar.jpg"
# Content-Type: application/octet-stream
# Content-Transfer-Encoding: binary
#
# ...jpegdata...
# --multiparty-boundary-1342--

You can also add files:

multiparty[:your_avatar] = File.open("foo.txt")

You can specify an optional content-type. If you don't, Multiparty will try and detect the correct MIME-type based on the filename.

multiparty[:your_avatar] = {:filename => "foo.jpg", :content_type => "text/plain", :content => File.read("foo.txt")}
# -> Content-Type: text/plain
multiparty[:your_avatar] = {:filename => "foo.jpg", :content => "not really jpeg")}
# -> Content-Type: image/jpeg
multiparty[:your_avatar] = File.open("foo.jpg")
# -> Content-Type: image/jpeg

Files and Tempfiles are interchangable in Multiparty:

tempfile = Tempfile.new("foo")
tempfile.write("Hello World!")
tempfile.rewind

multiparty[:message] = tempfile
# is the same as
multiparty[:message] = File.open(tempfile.path)

Arrays are handled in the conventional way using "array[]" as name:

multiparty[:items] = [1, 2, 3]

# --AaB03x
# Content-Disposition: form-data; name="items[]"
# 
# 1
# --AaB03x
# Content-Disposition: form-data; name="items[]"
# 
# 2
# --AaB03x
# Content-Disposition: form-data; name="items[]"
# 
# 3
# --AaB03x--

Using the parts accessor you can easily modify parts:

multiparty[:items] = [1, 2, 3]
multiparty[:items] << 4

# multiparty[:items] == [1, 2, 3, 4]

Multiparty has the to_s method aliased to body so you can use it as a String:

puts "Hello World! My multipart body: #{multiparty}"

If the API you're interface with only supports :key => :value headers, use header_value:

headers["Content-Type"] = multiparty.header_value

Installation

$ gem install multiparty

Testing

$ bundle install
$ rake spec

Todo

Author

David Verhasselt - david@crowdway.com